2009-01-14 11 views
50

que tienen una larga secuencia de dígitos hexadecimales en una cadena, comoCómo crear un objeto python bytes a partir de una cadena hexagonal larga?

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

sólo mucho más tiempo, varios kilobytes. ¿Hay una forma integrada de convertir esto a un objeto de bytes en Python 2.6/3?

+3

Tenga en cuenta que las respuestas a continuación pueden parecer iguales pero devolver diferentes tipos de valores . s.decode ('hex') devuelve un str, como lo hace unhexlify (s). bytearray.fromhex (s) devuelve un bytearray. Teniendo en cuenta la redacción de esta pregunta, creo que la marca de verificación verde grande debe estar en bytearray.de hexa (s), no en s.decode ('hex'). –

+0

Posible duplicado de [cadena hexadecimal a matriz de bytes en python] (http://stackoverflow.com/questions/5649407/hexadecimal-string-to-byte-array-in-python) –

+0

¿Cómo puede ser un duplicado de una pregunta? creado 2 años después? – recursive

Respuesta

35

Obras en Python 2.7 y superior, incluido python3:

result = bytearray.fromhex('deadbeef') 

Nota: Parece que hay un error con la función bytearray.fromhex() en Python 2.6. La documentación python.org establece que la función acepta una cadena como argumento, pero cuando se aplica, se lanza el siguiente error:

>>> 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

Y un paso adicional, yo quería un cadena de bytes (por ejemplo, Python 3's b '\ x04 \ xea [...]'), que se puede obtener de una bytearray con 'bytes (bytearray.fromhex ('deadbeef'))' – berto

+2

@berto: en ese caso hay una ruta más directa en forma de 'binascii.unhexlify()'. –

+0

Gracias, @MartijnPieters, voy a dar una oportunidad – berto

28

Prueba el binascii module

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

Dos formas de hacerlo en 2.x, tres formas en 3.x. Tanto para "solo hay una forma de hacerlo" ... – technomalogical

+0

Otras dos formas son más 'integradas', así que realmente usaría una de esas. –

+0

@technomalogical: su comentario es irrelevante para la respuesta; quizás deberías eliminarlo y cambiarlo a una publicación en comp.lang.python. – tzot

39

Usted puede hacer esto con el códec hexagonal. es decir:

>>> 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

Solo funciona en 2.x, no en 3.x. –

+9

'codecs.decode ('0a0a0a', 'hex_codec')' debería funcionar para 2.x y 3.x :-) – Abbafei

32
result = bytes.fromhex(some_hex_string) 
+10

Solo funciona en Python 3+ si no me equivoco – Triptych

-2
import binascii 

binascii.b2a_hex(obj) 
Cuestiones relacionadas