2010-11-18 17 views
1

Ich habe eine Reihe von binären Dateien, die Daten in folgendem Format enthalten:binäre Dateien in ascii in Python

i\xffhh\xffhh\xffhh\xffih\xffhh\xffhh\xffhh\xffhh\xffhi\xffii\xffjj\xffjj\xffjj\xffjk\xffkk\xffkk\xffkl\xffll\xffmm\xffmn\xffnn\xffon\xffno\xffop\xffop\xffpp\xffqq\xffrq\xffrs\xffst\xfftt\xfftt\xffuv\xffvu\xffuv\xffvv\xffvw\xffwx\xffwx\xffxy\xffyy\xffyz\xffz{\xffz{\xff||\xff}|\xff~}\xff}}\xff~~\xff~~\xff~\x7f\xff\x7f\x7f\xff\x7f\x7f\xff\x7f\x7f\xff\x80\x80\xff\x80\x81\xff\x81\x80\xff\x81\x81\xff\x81\x82\xff\x82\x82\xff\x82\x82\xff\x82\x83\xff\x83\x83\xff\x83\x83\xff\x83\x84\xff\x83\x84\xff\x84\x85\xff\x85\x85\xff\x86\x85\xff\x86\x87\xff\x87\x87\xff\x87\x87\xff\x88\x87\xff\x88\x89\xff\x88\x89\xff\x89\x8a\xff\x89\x8a\xff\x8a\x8b\xff\x8b\x8b\xff\x8b\x8c\xff\x8d\x8d\xff\x8d\x8d\xff\x8e\x8e\xff\x8e\x8f\xff\x8f\x8f

Diese sollen von Drucksensorwerten sein, wenn eine Person zu Fuß, so Ich gehe davon aus, dass es sich um Zahlen handelt, aber ich möchte sie in ASCII umwandeln, damit ich eine Vorstellung davon habe, was sie sind. Wie konvertiere ich sie? In welchem ​​Format sind sie derzeit?

EDIT: Link zur Datei hier zur Verfügung gestellt (Link)

+1

Dies ist interessant, weil sie gleich beim ersten Sinn Sinn machen scheinen. Meine Vermutung wäre, dass Sie sich das in einem Editor ansehen, der einige Binärdateien in Zeichen außerhalb des Hexbereiches übersetzt (~ Tilde zum Beispiel ist kein Hexadezimalzeichen). Können Sie uns den Speicherauszug eines tatsächlichen Hex-Editors zeigen, einen Link zu der Datei anzeigen oder das Dateiformat ermitteln, aber in der Dokumentation des verwendeten Geräts nachsehen? – marr75

+0

Könnte 3 Bytes pro Beispiel sein, mit dem mittleren Byte immer 255 aus irgendeinem Grund. Von welchem ​​Gerät stammen die Daten? –

+0

Großartig! Ich bin auf diese Frage gekommen, weil ich die Kalibrierdatei ('.cal3') eines FootWork Drucksensors hacken möchte. Kleine Welt! – heltonbiker

Antwort

4

Sie nicht das Format von nur eröffnet eine Binärdatei erraten kann. Sie müssen Informationen über die Art und Weise erhalten, wie Daten für die jeweiligen Drucksensorwerte gespeichert werden.

Natürlich, wenn Sie das Format kennen, ist es einfach, die Datei in Binär-Modus zu lesen und dann von allen aussagekräftige Daten erhalten sie

FILE = open(filename,"rb") 
FILE.read(numBytes) 
+1

... und zum Entschlüsseln der Daten nach dem Lesen können Sie struct-Modul verwenden: http://docs.python.org/library/struct.html – che

+1

Das ist eine Antwort? Du bekommst 45 Zorkmids dafür? –

+0

Ich habe einen Fehler numBytes ist nicht definiert – Vincent

0

Der erste Teil sehr seltsam aussieht. Normalerweise ist eine Zahl wie \ x8e nur ein Code für ein Byte in Hex, außer im ersten Teil haben Sie Buchstaben wie hh, die nicht Teil einer Hex-Zahl sein sollten.

Aber für den zweiten Teil, den Sie so etwas wie tun:

hex_list = r"\x7f\xff\x7f\x7f\xff\x7f\x7f\xff\x7f\x7f\xff\x80\x80\xff\x80\x81\xff\x81\x80\xff\x81\x81\xff\x81\x82\xff\x82\x82\xff\x82\x82\xff\x82\x83\xff\x83\x83\xff\x83\x83\xff\x83\x84\xff\x83\x84\xff\x84\x85\xff\x85\x85\xff\x86\x85\xff\x86\x87\xff\x87\x87\xff\x87\x87\xff\x88\x87\xff\x88\x89\xff\x88\x89\xff\x89\x8a\xff\x89\x8a\xff\x8a\x8b\xff\x8b\x8b\xff\x8b\x8c\xff\x8d\x8d\xff\x8d\x8d\xff\x8e\x8e\xff\x8e\x8f\xff\x8f\x8f" 
int_list = [int(hex,16) for hex in hex_list.replace('\\', ';0').split(';') if hex != ''] 

Hinweis erhalten Sie immer eine Zahl zwischen 127 und 143, mit Ausnahme der 255 (die \ xff).

3

Ich bin absolut schockiert und fassungslos und nicht ein bisschen erstaunt über die ganze Waffel wie "Sie haben Buchstaben wie hh, die nicht Teil einer hex Zahl sein sollten" und "sie scheinen anfangen, Sinn direkt am zuerst \ x7f ". Hat noch niemand einen Ausgang repr() gesehen?

Die folgenden zeigt, wie es so geendet oben könnte, die \xff ignorieren, die nur Rauschen zu sein scheint:

>>> guff = open('your_file.bin', 'rb').read() 
>>> cleaned = guff.replace("\xff", "") 
>>> cleaned 
'ihhhhhhihhhhhhhhhhiiijjjjjjjkkkkkklllmmmnnnonnoopopppqqrqrsstttttuvvuuvvvvwwxwx 
xyyyyzz{z{||}|~}}}~~~~~\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x80\x80\x80\x81\x81\x80\x81\ 
x81\x81\x82\x82\x82\x82\x82\x82\x83\x83\x83\x83\x83\x83\x84\x83\x84\x84\x85\x85\ 
x85\x86\x85\x86\x87\x87\x87\x87\x87\x88\x87\x88\x89\x88\x89\x89\x8a\x89\x8a\x8a\ 
x8b\x8b\x8b\x8b\x8c\x8d\x8d\x8d\x8d\x8e\x8e\x8e\x8f\x8f\x8f' 
# Note that lines wrap at column 80 in a Windows "Command Prompt" window ... 
>>> pressure = [ord(c) for c in cleaned] 
>>> pressure 
[105, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 104, 
104, 104, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 
107, 107, 108, 108, 108, 109, 109, 109, 110, 110, 110, 111, 110, 110, 111, 111, 
112, 111, 112, 112, 112, 113, 113, 114, 113, 114, 115, 115, 116, 116, 116, 116, 
116, 117, 118, 118, 117, 117, 118, 118, 118, 118, 119, 119, 120, 119, 120, 120, 
121, 121, 121, 121, 122, 122, 123, 122, 123, 124, 124, 125, 124, 126, 125, 125, 
125, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 
129, 129, 128, 129, 129, 129, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 
131, 131, 132, 131, 132, 132, 133, 133, 133, 134, 133, 134, 135, 135, 135, 135, 
135, 136, 135, 136, 137, 136, 137, 137, 138, 137, 138, 138, 139, 139, 139, 139, 
140, 141, 141, 141, 141, 142, 142, 142, 143, 143, 143] 
>>> 

Sie: aus der Datei Arbeits zurück

>>> pressure = [120,121,122,123,124,125,126,127,128,129,130,131] 
>>> import struct 
>>> some_bytes = struct.pack("12B", *pressure) 
>>> print repr(some_bytes) 
'xyz{|}~\x7f\x80\x81\x82\x83' 
>>> 

So wollen wir versuchen, Ich muss immer noch die Dokumente für das Gerät lesen, um herauszufinden, was der Skalierungsfaktor ist, um diese 0-254-Werte zu multiplizieren.

Sie werden feststellen, dass sich die abgeleiteten Zahlen jedes Mal um +1, 0 oder -1 ändern. Dies passt gut zu einer Hypothese, dass es nur 1 Byte pro Lesevorgang statt zwei oder mehr Bytes pro Lesevorgang ist.

Ein anderer Gedanke: vielleicht ist die \xff ein Start oder Ende Sentinel, und es gibt zwei Werte (Start, Stopp) oder (Sensor-A, Sensor-B) wird jeden Zyklus gemeldet.