2016-05-12 8 views
-1

Dies ist mein erstes Mal mit Binärdateien direkt so nackt mit mir arbeiten.interpretieren binäre Daten in Python

Ich bin mit Python 2.7

ich eine große Binärdatei zu verwenden, versuche, die die geografische Breite/Länge jedes Pixel eines Bildes angibt.

Mit diesem Code: open('input', 'rb').read(50)

Die Datei sieht wie folgt aus: \x80\x0c\x00\x00\x00\x06\x00\x00.\x18\xca\xe4.\x18\xcc\xe4.\x18\xcf\xe4.\x18\xd1\xe4.\x18\xd3\xe4.\x18\xd5\xe4.\x18\xd7\xe4.\x18\xd9\xe4/\x18\xdb\xe4/\x18\xdd\xe4/\x18 ...

Die readme für die Datei, die die folgenden Informationen für die Decodierung gibt, aber ich bin nicht sicher, wie sie anzuwenden :

Die Dateien befinden sich in LSBF-Byte-Reihenfolge. Die Dateien beginnen mit 2 4-Byte-Integer-Werten, die die Pixel- und Zeilengröße (x, y) der Datei angeben. Nachdem die Dateien aufeinanderfolgende Paare von Elementen haben, werden 2-Byte-Ganzzahlwerte von Breite und Länge mit 100 multipliziert und abgeschnitten (z. B. 75.324 E ist "-7532").

Danke für jede Hilfe.

Beachten Sie den Grund dafür, ein Bild basierend auf lat/long und nicht das Pixel # zu zeichnen/ändern, falls sich jemand fragen sollte.

+1

Sie können dies in ein NumPy-Array konvertieren. Wäre das praktisch? Übrigens benutzt du Python 2 oder Python 3? –

+0

Die beiden wichtigsten Werkzeuge in Python sind das Modul ['struct'] (https://docs.python.org/2/library/struct.html) und [' numpy.fromfile'] (http: // docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.fromfile.html). Angesichts des großen Datenblocks wird numpy wahrscheinlich am einfachsten und schnellsten sein. [Hier ist] (http://stackoverflow.com/questions/14245094/how-to-read-part-of-binary-file-with-numpy) ein Beispiel. Ich schlage vor, dass Sie es versuchen und eine spezifische Frage stellen, wenn Sie Probleme damit haben. – tom10

+0

Sorry bearbeitet, um mit Python 2.7 zu sagen. – MattS

Antwort

0

Im Allgemeinen, wenn Sie mit Binärdateien arbeiten, möchten Sie die Funktionen packen und entpacken (https://docs.python.org/2/library/struct.html) verwenden. Dadurch können Sie die Endlichkeit der Daten sowie die Datentypen steuern. In Ihrem speziellen Fall werden Sie wahrscheinlich wollen die Header-Informationen zuerst, so etwas wie

with open('input', 'rb') as fp: 

    # read the header bytes to get the number of elements 

    header_bytes = fp.read(8) 

    # convert the bytes to two unsigned integers. 

    x, y = unpack("II", header_bytes) 

    # Loop through the file getting the rest of the data 
    # read Y lines of X pixels 

    ... 

Die oben war nicht wirklich laufen oder Test lesen, nur versucht, einen allgemeinen Sinn eines Ansatzes zu geben.