Zerlegen von Binärstrom mit 'struct'

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
unsinn
User
Beiträge: 2
Registriert: Dienstag 3. März 2015, 19:15

Hallo Zusammen,

ich versuche mit 'struct' einen Struct-Binärstrom zu zerlegen, womit ich früher eigentlich nie Probleme hatte.

Folgende Ausgangssituation.

Binäre Daten:

Code: Alles auswählen

payload = ['v', '\xd6', '\x06', '\x00', '\x00', ' ', '\x00', '\x00', '\x03', 'C', '\x01', '\x8d', '\xfc', '\x9f', '\x02', 'r', '\x00', 'u', '\x10', '\xcf', '\x12', '[', '\x13', '\x00', '\x16', '\xff', '\xbc', '\xb5', 'f', 'z', '\x03']
Typen und Längen:

len(payload) == 31
type(payload) == list
type (payload[0]) == str

Alles Easy soweit wie ich es eigentlich erwarte.

Nun hier mein Struct, mit welchem ich die ursprünlichen Werte zurückbilden möchte:

Code: Alles auswählen

[a, b, c, d, e, f, g, h, i, j, k, l, m, n] = struct.unpack('=I H f b hhh hhh hhh h', payload)
Also auch 31 Byte, wie oben der Payload.

Nun meckert aber der Befehl:

Code: Alles auswählen

struct.error: unpack requires a string argument of length 31
Irgendwie finde ich den Fehler nicht, wohl liegt es an der Betriebsblindheit.

Die Länge entspricht doch 31 Byte !?

Kann mir jemand auf die Sprünge helfen?

Vielen Dank euch!
Unsinn
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Gerne doch. Du hast alles richtig gemacht (vermute ich, ich habe den Code nicht auf Logik geprüft). Aber du musst struct einen (Byte) String übergeben keine Liste.

Code: Alles auswählen

data = "".join(payload)
[a, b, c, d, e, f, g, h, i, j, k, l, m, n] = struct.unpack('=I H f b hhh hhh hhh h', data)
unsinn
User
Beiträge: 2
Registriert: Dienstag 3. März 2015, 19:15

Sr4l hat geschrieben: Gerne doch. Du hast alles richtig gemacht (vermute ich, ich habe den Code nicht auf Logik geprüft). Aber du musst struct einen (Byte) String übergeben keine Liste.
Ich danke vielmals. Das war's! :-)

Schönen Abend noch wünschend,
Unsinn
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@unsinn: und dann würde ich payload gleich als Bytestring definieren und nicht als Liste. Wegen der Lesbarkeit vielleicht auch als Hexwerte.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würde wahrscheinlich ein `bytearray` benutzen. Mal etwas sinnfrei:

Code: Alles auswählen

>>> struct.unpack('h', bytearray([0xb5, 0xd3]))
(-11339,)
EDIT: `bytes` ginge genau so.
Antworten