¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?
¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?
Veo afirmaciones de un bytes.hex
método, bytes.decode
códecs y he probado otras funciones posibles de menor asombro sin éxito. ¡Solo quiero mis bytes como hexadecimales!
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 bytearray
tipo mutable.
Referencia: https://docs.python.org/3/library/stdtypes.html#bytes.hex
Utilice el binascii
mó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
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.decode
son 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.
Como novedad en Python 3.8, puede pasar un argumento delimitador a la hex
funció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