2016-03-28 4 views
0

Bei einem Hexadezimalwert von 0x183C6 möchte ich den entsprechenden Byte-Wert mit genau 3 Bytes schreiben. Ich weiß, dass struct dies zu 4 Bytes tun würde, aber meine Einschränkungen sind zu 3 Bytes.Wie packst du drei Bytes in eine Python-Struktur?

So

>>> val = 0x183c6 
>>> struct.pack('>L', val) 
'\x00\x01\x83\xc6' 

ist groß, aber ich will nur:

'\x01\x83\xc6' 

Ich konnte Prozess posten und es nach der Tat abzustreifen, ich könnte es brechen und setzen jedes einzelne Byte in ein bytearray(), oder vielleicht ein bisschen verschieben, aber ich frage mich, ob es eine einfachere Möglichkeit gibt, dies innerhalb der Struktur ohne Nachbearbeitung zu tun.

+0

Werfen Sie einen Blick auf diese http://stackoverflow.com/questions/34794640/python-struct-pack-pack-mehrere-data-in-a-list-oder-a-tuple – Hans

Antwort

2

Sie können den Wert in seine High-Byte und niedrigen 16-Bit-Wort mit divmod aufgeteilt:

>>> struct.pack(">BH", *divmod(0x183c6, 1<<16)) 
'\x01\x83\xc6' 

Zum Auspacken

>>> struct.unpack(">I", '\x00' + '\x01\x83\xc6') 
+0

Aber wie würden Sie es auspacken? –

+0

Das passt, was ich brauche. Danke. – tomasz

1

Sie können das nicht wirklich tun, da Strukturen nicht so funktionieren. Wenn Sie unbedingt wissen, dass der Wert nie 3 Bytes überschreiten, können Sie Big-Endian-Codierung sowohl für Verpackung verwenden und Auspacken:

>>> val = 0x183c6 
>>> packed = struct.pack('>L', val)[1:] 
>>> packed 
'\x01\x83\xc6' 
>>> '{0:x}'.format(struct.unpack('>L', '\x00' + packed)[0]) 
'183c6' 

Beachten Sie, dass der gepackte Wert wird so ziemlich nutzlos für andere C-Funktionen vorbei, o.ä.