Seite 1 von 1

Zerlegen von Binärstrom mit 'struct'

Verfasst: Dienstag 3. März 2015, 19:25
von unsinn
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

Re: Zerlegen von Binärstrom mit 'struct'

Verfasst: Dienstag 3. März 2015, 19:37
von Sr4l
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)

Re: Zerlegen von Binärstrom mit 'struct'

Verfasst: Dienstag 3. März 2015, 19:42
von unsinn
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

Re: Zerlegen von Binärstrom mit 'struct'

Verfasst: Mittwoch 4. März 2015, 08:39
von Sirius3
@unsinn: und dann würde ich payload gleich als Bytestring definieren und nicht als Liste. Wegen der Lesbarkeit vielleicht auch als Hexwerte.

Re: Zerlegen von Binärstrom mit 'struct'

Verfasst: Mittwoch 4. März 2015, 09:10
von snafu
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.