¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?

Resuelto Matt Joiner asked hace 13 años • 9 respuestas

¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?

Veo afirmaciones de un bytes.hexmétodo, bytes.decodecódecs y he probado otras funciones posibles de menor asombro sin éxito. ¡Solo quiero mis bytes como hexadecimales!

Matt Joiner avatar Jul 08 '11 19:07 Matt Joiner
Aceptado

Desde Python 3.5, esto finalmente ya no es incómodo:

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

y al revés:

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

también funciona con el bytearraytipo mutable.

Referencia: https://docs.python.org/3/library/stdtypes.html#bytes.hex

Felix Weis avatar Mar 22 '2016 08:03 Felix Weis

Utilice el binasciimódulo:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

Vea esta respuesta: Python 3.1.1 cadena a hexadecimal

Mu Mind avatar Jul 08 '2011 12:07 Mu Mind

Python tiene códecs estándar de bytes a bytes que realizan transformaciones convenientes como imprimible con comillas (se ajusta a ascii de 7 bits), base64 (se ajusta a caracteres alfanuméricos), escape hexadecimal, compresión gzip y bz2. En Python 2, podrías hacer:

b'foo'.encode('hex')

En Python 3, str.encode/ bytes.decodeson estrictamente para conversiones de bytes<->str. En su lugar, puedes hacer esto, que funciona en Python 2 y Python 3 ( s/encode/decode/g para lo inverso):

import codecs
codecs.getencoder('hex')(b'foo')[0]

A partir de Python 3.4, existe una opción menos incómoda:

codecs.encode(b'foo', 'hex')

También se puede acceder a estos códecs varios dentro de sus propios módulos (base64, zlib, bz2, uu, quopri, binascii); La API es menos consistente, pero para los códecs de compresión ofrece más control.

Gabriel avatar Apr 16 '2013 09:04 Gabriel

Como novedad en Python 3.8, puede pasar un argumento delimitador a la hexfunción, como en este ejemplo.

>>> value = b'\xf0\xf1\xf2'
>>> value.hex('-')
'f0-f1-f2'
>>> value.hex('_', 2)
'f0_f1f2'
>>> b'UUDDLRLRAB'.hex(' ', -4)
'55554444 4c524c52 4142'

https://docs.python.org/3/library/stdtypes.html#bytes.hex

Peter Mitrano avatar Dec 03 '2019 08:12 Peter Mitrano