binary struct in Python
Hallo, ich habe binäre Daten, die ich gerne in Python Floats umwandeln würde. Leider bin ich bei der Verwendung von `structs.unpack` über das Problem gestoßen, dass meine Daten nicht nur aus floats ("f") bestehen, sondern auch chars ("c") und half-floats ("e") und letztere auf die größe von floats aufgebläht werden, wenn ich sie in einem structs entpacken will. Beispiel: Folgende Daten liegen vor (eigentlich als Datenstrom, also eher 1000 * data): ``` data = b'B\x00\x00y\xda\x00\x03\x12\xda\x00\x01!\xe2\x00\x00\x9d\xbb\r\xac\x00\x00\x00\x00\r' ``` Eigentlich könnte man sie mit "cffffefc" lesen, wenn das "c" und "e" als 1 byte und 2 byte groß angenommen würden und nicht in Kombination mit "f" als 4 byte groß, sodass statt 24 byte 29 erwartet würden. Gewünscht ist folgendes Verhalten: ``` import struct def packet_to_data(packet): Bx, TH, By, Bz = struct.unpack(">ffff", packet[1:17]) TEd = struct.unpack(">e", packet[17:19])[0] TEa = struct.unpack(">f", packet[19:23])[0] end = packet[23:24].decode("ascii") start= packet[:1].decode("ascii") if packet.startswith(b"B") and end == "\r": return Bx, By, Bz, TH, TEd, TEa ``` jedoch am Besten als Iterator, wie `struct.iter_unpack("cffffefc", data)`. Gibt es soetwas, möglichst performant, hättet ihr Vorschläge zum Optimieren meiner Funktion oder andere Vorschläge? Vielen Dank und freundliche Grüße, Julian
Am 20.12.18 um 15:45 schrieb Julian Gethmann:
Eigentlich könnte man sie mit "cffffefc" lesen, Wenn der Formatstring kein Präfix hat, wird native Byteorder und Alignment angenommen.
https://docs.python.org/3/library/struct.html#byte-order-size-and-alignment Du hast aber kein Alignment, also musst ein Präfix benutzen, also z.B. bei Big-Endian Byteorder: >>> struct.unpack('>cffffefc', data) (b'B', 4.3712104296148344e-41, 2.822691548628052e-40, 1.0399035903754467e-40, 5.658303069097179e-41, 0.00034618377685546875, 0.0, b'\r') Gruß, Chris
Vielen Dank. Dann habe ich wohl das mit dem Alignment nicht beachtet. Gruß, Julian On 20/12/2018 17.01, Christopher Arndt wrote:
Am 20.12.18 um 15:45 schrieb Julian Gethmann:
Eigentlich könnte man sie mit "cffffefc" lesen, Wenn der Formatstring kein Präfix hat, wird native Byteorder und Alignment angenommen.
https://docs.python.org/3/library/struct.html#byte-order-size-and-alignment
Du hast aber kein Alignment, also musst ein Präfix benutzen, also z.B. bei Big-Endian Byteorder:
>>> struct.unpack('>cffffefc', data) (b'B', 4.3712104296148344e-41, 2.822691548628052e-40, 1.0399035903754467e-40, 5.658303069097179e-41, 0.00034618377685546875, 0.0, b'\r')
Gruß, Chris _______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
participants (2)
-
Christopher Arndt
-
Julian Gethmann