Frage

Ich eröffne eine Binärdatei bis etwa so:

file = open("test/test.x", 'rb')

und auf eine Liste in den Zeilen zu lesen. Jede Zeile sieht ein wenig wie:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'

Ich habe eine harte Zeit, um diese Daten zu manipulieren. Wenn ich versuche, und jede Zeile, Python gefriert drucken, und gibt Geräusche zu piepen (ich glaube, es gibt einen binären Beep-Code dort irgendwo). Wie gehe ich über diese Daten sicher mit? Wie kann ich jede Hex-Zahl in Dezimal-Format konvertieren?

War es hilfreich?

Lösung

Um es zu drucken, können Sie etwas tun:

print repr(data)

Für das Ganze als hex:

print data.encode('hex')

Für den Dezimalwert jedes Byte:

print ' '.join([str(ord(a)) for a in data])

auspacken binäre Zahlen, usw. aus den Daten, als ob sie stammte ursprünglich aus einer C-Stil Struktur, Blick auf dem struct Modul.

Andere Tipps

\xhh ist das Zeichen mit Hex-Wert hh . Andere Zeichen wie . und `~‘ sind normale Zeichen.

Iterieren auf einer Zeichenkette gibt Ihnen die Zeichen darin, einen nach dem anderen.

ord(c) wird eine ganze Zahl zurück, die Zeichen darstellen. Eg, ord('A') == 65.

Damit wird die Dezimalzahlen für jedes Zeichen gedruckt werden:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
print ' '.join(str(ord(c)) for c in s)

Wie theatrus erwähnt, ord und hex könnte Ihnen helfen. Wenn Sie möchten, um zu versuchen, irgendeine Art von strukturierten binären Daten in der Datei zu interpretieren, die struct Modul könnte hilfreich sein.

Binärdaten werden selten in „Linien“ getrennt, geteilt durch ‚\ n‘. Wenn es ist, wird es einen impliziten oder expliziten escape Mechanismus zwischen ‚\ n‘ als Leitungsabschluss und ‚\ n‘ als ein Teil der Daten zu unterscheiden. Lesen einer solchen Datei als Linien blind ohne Kenntnis der Escape-Mechanismus ist sinnlos.

Ihre spezifischen Anliegen beantworten:

‚\ x07‘ sind die ASCII BEL Zeichen, die mit der Glocke auf einem Fernschreiber Maschine ursprünglich waren.

Sie können den Integer-Wert eines Bytes 'b' erhalten, indem ord(b) tun.

JEDOCH Binärdaten richtig zu verarbeiten, müssen Sie wissen, was das Layout ist . Sie haben können und ganze Zahlen ohne Vorzeichen signiert (der Größen 1, 2, 4, 8 Byte), Gleitkommazahlen, Dezimalzahlen von unterschiedlicher Länge, feste Länge Strings variabler Länge Zeichenfolge, etc etc. zusätzliche Komplikation kommt aus, ob die Daten aufgezeichnet werden, in bigEndian Mode oder littleendian Mode. Sobald Sie alle oben wissen (oder haben sehr gut informierte Vermutungen), der Python struct-Modul sollte für alle oder die meisten Ihrer Verarbeitung werden können, verwendet werden; der ctypes Modul auch nützlich sein kann.

Ist das Datenformat einen Namen? Wenn ja, sagen Sie uns; wir können Sie Code oder Dokumente in der Lage zu zeigen.

Sie fragen: „Wie gehe ich über diese Daten sicher mit?“ das wirft die Frage auf: Was wollen Sie es für verwenden? Welche Manipulationen tun Sie tun möchten?

Sie versuchen, die Daten in ASCII-Zeichen umgewandelt zu drucken, die nicht funktionieren.

Sie können sicher jedes Byte der Daten verwenden. Wenn Sie wollen, dass es als hexadezimale drucken, Blick auf die Funktionen ord und hex /

Sind Sie mit read() oder readline()? Sie sollten mit read(n) lesen n Bytes sein; readline() wird lesen, bis es eine neue Zeile trifft, die die binäre Datei möglicherweise nicht haben.

In jedem Fall aber werden Sie eine Reihe von Bytes zurückgegeben, die druckbare oder nicht druckbare Zeichen sein kann, und sind wahrscheinlich nicht sehr nützlich.

Was Sie wollen, ist ord(), die einen Ein-Byte-String in den entsprechenden ganzzahligen Wert umwandelt. read() aus der Datei ein Byte zu einem Zeitpunkt und Anruf ord() auf das Ergebnis oder eine Iteration durch die gesamte Zeichenfolge.

Wenn Sie bereit sind NumPy zu verwenden und Bitstrom , können Sie

>>> from numpy import *
>>> from bitstream import BitStream
>>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
>>> stream = BitStream(raw)
>>> stream.read(raw, uint8, len(stream) // 8)
array([190,   0, 200, 100, 248, 100,   8, 228,  46,   7, 126,   3, 158,
         7, 190,   3, 222,   7, 254,  10], dtype=uint8)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top