2009-01-14 9 views
50

J'ai une longue séquence de chiffres hexadécimaux dans une chaîne, commeComment créer un objet python bytes à partir d'une longue chaîne hexadécimale?

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

seulement beaucoup plus, plusieurs kilo-octets. Existe-t-il un moyen de convertir ceci en un objet bytes dans python 2.6/3?

+3

Notez que les réponses ci-dessous peuvent se ressembler, mais ils retournent différents types de valeurs . s.decode ('hex') renvoie un str, tout comme unhexlify (s). bytearray.fromhex (s) renvoie un bytearray. Vu le libellé de cette question, je pense que la grosse coche verte devrait être sur bytearray.fromhex (s), pas sur s.decode ('hex'). –

+0

Copie possible de [chaîne hexadécimale à octet tableau en python] (http://stackoverflow.com/questions/5649407/hexadecimal-string-to-byte-array-in-python) –

+0

Comment peut-il être une copie d'une question créé 2 ans plus tard? – recursive

Répondre

35

Works en Python 2.7 et supérieur, y compris python3:

result = bytearray.fromhex('deadbeef') 

Note: Il semble y avoir un bug avec la fonction bytearray.fromhex() en Python 2.6. La documentation python.org indique que la fonction accepte une chaîne comme argument, mais lorsqu'il est appliqué, l'erreur suivante est générée:

>>> bytearray.fromhex('B9 01EF') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: fromhex() argument 1 must be unicode, not str` 
+2

Et une étape supplémentaire, je voulais un chaîne d'octets (par exemple b '\ x04 \ xea [...]' de Python 3), que vous pouvez obtenir d'un bytearray avec 'bytes (bytearray.fromhex ('deadbeef'))' – berto

+2

@berto: dans ce cas il y a une route plus directe sous la forme de 'binascii.unhexlify()'. –

+0

Merci, @MartijnPieters, je vais donner un coup de feu – berto

28

Essayez le binascii module

from binascii import unhexlify 
b = unhexlify(myhexstr) 
+4

Deux façons de le faire en 2.x, trois façons en 3.x. Tant pis pour "il n'y a qu'une seule façon de le faire" ... – technomalogical

+0

D'autres deux façons sont plus "intégrées" donc j'utiliserais vraiment l'une d'entre elles. –

+0

@technomalogical: votre commentaire n'est pas pertinent pour la réponse; peut-être devriez-vous le supprimer et le remplacer par un post sur comp.lang.python. – tzot

39

Vous pouvez le faire avec le codec hexagonal. à savoir:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44' 
>>> s.decode('hex') 
'\x00\x00\x00\x00\x00\[email protected]\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\[email protected]\xa4=P\x05\xbdD' 
+23

Ne fonctionne que dans 2.x, pas 3.x. –

+9

'codecs.decode ('0a0a0a', 'hex_codec')' devrait fonctionner pour 2.x et 3.x :-) – Abbafei

32
result = bytes.fromhex(some_hex_string) 
+10

Fonctionne uniquement en Python 3+ si je ne me trompe pas – Triptych

-2
import binascii 

binascii.b2a_hex(obj)