2016-03-28 1 views
0

Étant donné une valeur hexadécimale de 0x183C6 Je voudrais écrire sa valeur d'octet correspondante en utilisant exactement 3 octets. Je sais que la structure ferait cela à 4 octets mais mes contraintes sont à 3 octets.Comment empaqueter trois octets dans une structure python?

Alors

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

est grand, mais je veux simplement:

'\x01\x83\xc6' 

je pouvais poster processus et la bande après le fait, je pourrais le casser et de mettre chaque octet individuel dans un bytearray(), ou peut-être faire un peu de décalage, mais je me demande s'il existe une façon plus simple de le faire dans struct sans post-traitement.

+0

Jetez un oeil à ce http://stackoverflow.com/questions/34794640/python-struct-pack-pack-multiple-data-dans-une-liste-ou-un-tuple – Hans

Répondre

2

Vous pouvez diviser la valeur dans son octet haut et bas mot de 16 bits avec divmod:

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

Pour déballer,

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

Mais comment le déballerais-tu? –

+0

Cela correspond à ce dont j'ai besoin. Je vous remercie. – tomasz

1

Vous ne pouvez pas vraiment faire cela, car ce n'est pas comme cela que fonctionnent les structures. Si vous ne savez absolument que la valeur ne dépassera jamais 3 octets, vous pouvez utiliser l'encodage big-endian pour les emballage et le déballage:

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

Notez que la valeur emballée sera à peu près inutile pour passer à d'autres fonctions C, ou similaire.