2016-03-25 5 views
0

Ich habe eine rohe Binärdatei (1 KB ↓), die eine serielle Datensicherung eines GPS-Datenstroms (zusammen mit einigen zugehörigen Metadaten) ist. Ich versuche speziell, einen Wert aus der Binärdatei zu ziehen, die die GPS-Zeit darstellt. Ich kenne seinen Offset und seine Breite in der Datei (10 bzw. 8 Bytes, mit einer Gesamtbildbreite von 28 Bytes), aber es ist auf eine sehr seltsame Art und Weise codiert, wie in dem Zitat unten beschrieben.Decoding Scrambed Binärdaten von GPS mit Python

Was ist die pythonischste Art, diese Daten (in eine Liste oder ein Array) zu lesen?


GPS-Zeit - GPS-Sensor (Zeit der Woche in Sekunden, bei ab Samstag 2400 Stunden/Sonntag 0000 Stunden), wenn die GPS-Zeit gültige Nachricht 3500 auf 1 gesetzt ist, sonst SDN500 Systemzeit seit Einschalten wird gemeldet. Datenworte in der Reihenfolge 2, 1 (MSW), 4 (LSW), 3.


Eine Nachricht, Wortlänge 16 Bits auf der SDN500-HV-Schnittstelle. Das SDN500-HV-Protokoll, das einen Standard Universal Asynchronous Empfängersender (UART) verwendet, überträgt Daten in 8-Bit-Gruppen (Bytes). Dies bedeutet, dass zwei Bytes benötigt werden, um eine Nachricht Wort zu bilden.

Ein Byte von Informationen als eine Folge von 11 Bits übertragen: ein Startbit, 8 Datenbits (niederwertigste Bit (LSB) zuerst), eine Paritätsbit (ungerade) und ein Stoppbit. Für jedes 16-Bit-Datenwort wird das niedrigstwertige Byte zuerst übertragen, gefolgt von dem höchstwertigen Byte . Integer- und Gleitkomma-Datentypen, die aus mehr als einem Wort bestehen, werden von dem Wort mit der niedrigsten Nummer an das Wort mit der höchsten Nummer übertragen. Die einzige Ausnahme von dieser Regel ist die Zeit , die in den Wörtern 6-9 jeder HV-Ausgangsmeldung ausgegeben wird. Die vier 1612-Bit-Datenwörter sind in der folgenden Reihenfolge: 2,1,4,3, wobei 1 das höchstwertige Wort und 4 das niederwertigste Wort darstellt. Jedes Wort wird separat byteweise umgekehrt.

+0

Wenn Sie eine andere Sprache beherrschen (wie Matlab oder C), würde ich immer noch gerne ein Beispiel Codeausschnitt sehen, der diese Daten lesen würde. Dies würde mir helfen zu verstehen, wie man es besser in Python lesen kann. – Nick

+1

Hoffentlich wird jemand anderes Ihnen bessere Informationen geben, aber das Modul https://docs.python.org/2/library/struct.html ist, wo Sie nach Binärdatei-E/A suchen. Ich habe es nur einmal für eine kurze Zeit benutzt, daher kann ich nicht viel mehr helfen. –

+0

@JLPeyret yeah Ich habe mich mit struct beschäftigt.Entpacke Varianten und einen Hex-Editor den ganzen Tag, um vernünftige Werte daraus zu erhalten, aber habe nicht den richtigen Weg gefunden, die MSB/LSB-Struktur zu lesen. Obwohl ich in der Lage war, einige der anderen Felder auf diese Weise zu lesen. – Nick

Antwort

1

Start durch Öffnen der Datei

fin = open("20160128t184727_pps","rb") 

dann in einem Rahmen lesen

def read_frame(f_handle): 
    frame = f_handle.read(28) # 28 byte frame size 
    start_byte = 10 
    end_byte = 18 # 4 words each word is 2 bytes 
    timestamp_raw = frame[start_byte:end_byte] 
    timestamp_words = struct.unpack(">HHHH",timestamp_raw) 

Ich könnte wahrscheinlich mehr helfen, aber ich verstehe nicht, wo der Zeitstempel Startbyte und endbyte aus Ihrer Beschreibung ist als es scheint nicht zu der Beschreibung, die Sie zitiert ... Ich weiß auch nicht, was der erwartete Ausgabewert ist ... Wenn Sie diese Details zur Verfügung gestellt würde ich wahrscheinlich helfen könnte

+0

Danke. Ich habe die Frage vor ein paar Minuten bearbeitet, da ich die falsche Breite hatte. Ich gebe deinem Ansatz eine Chance. – Nick

+0

oh ok ich sehe jetzt klingt es realistischer ... kombiniert sie zurück bin ich nicht sicher, was Sie erwarten? etwas wie '20160322134566' (YMDHMS)? oder ein Zeitstempel von Sekunden seit der Epoche? oder ? –

+0

Das GPS meldet die Zeit seit Beginn der Woche (beginnend mit Sonntag). Ich denke, es ist in Sekunden. – Nick