¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?
Veo reclamos de un bytes.hex
método, bytes.decode
códecs, y he probado otras posibles funciones de menor asombro sin resultado. ¡Solo quiero mis bytes como hexadecimales!
python
python-3.x
hex
Matt Joiner
fuente
fuente
Respuestas:
Desde Python 3.5 esto finalmente ya no es incómodo:
y reversa:
Funciona también con el
bytearray
tipo mutable .Referencia: https://docs.python.org/3/library/stdtypes.html#bytes.hex
fuente
bytes.fromhex()
también está disponible en Python 3.0+ (no solo 3.5+).bytes.hex()
solo está en Python 3.5+.Usa el
binascii
módulo:Ver esta respuesta: Python 3.1.1 cadena a hexadecimal
fuente
str
pero abytes
. Yo sé que el PO parece contento con la respuesta, pero no va a ser mejor para expandir esta respuesta para incluir.decode("ascii")
también a convertirla en una "cadena"bytes
. Siprint(b'666f6f')
obtienes elb
en la impresión. Si tú.decode("ascii")
entonces no lo haces. Solo pensando en cómo aquellos que realmente tenían unbytes
(binario verdadero con elementos> 128, no una cadena ascii) querían imprimirlo..hex()
método en PythonPython tiene códecs estándar de bytes a bytes que realizan transformaciones convenientes como imprimible entre comillas (encaja en 7 bits ascii), base64 (encaja en alfanuméricos), escape hexadecimal, compresión gzip y bz2. En Python 2, podrías hacer:
En Python 3,
str.encode
/bytes.decode
son estrictamente para conversiones bytes <-> str. En cambio, puede hacer esto, que funciona en Python 2 y Python 3 ( s / encode / decode / g para el inverso):Comenzando con Python 3.4, hay una opción menos incómoda:
Estos códecs misceláneos también son accesibles 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.
fuente
LookupError: unknown encoding: hex
binascii.hexlify(b'foo')
directamentefunciona en Python 3.3 (por lo tanto, "hex_codec" en lugar de "hex").
fuente
El método
binascii.hexlify()
se convertirábytes
en unabytes
representación de la cadena hexadecimal ascii. Eso significa que cada byte en la entrada se convertirá en dos caracteres ascii. Si quieres una verdaderastr
salida, entonces puedes obtener.decode("ascii")
el resultado.Incluí un fragmento que lo ilustra.
desde la cadena hexadecimal
"0a160a04"
a puede volver a labytes
con labinascii.unhexlify("0a160a04")
que devuelveb'\n\x16\n\x04'
fuente
De acuerdo, la siguiente respuesta está un poco fuera de alcance si solo te importa Python 3, pero esta pregunta es el primer éxito de Google incluso si no especificas la versión de Python, así que aquí hay una manera que funciona tanto en Python 2 como en Python 3 .
También estoy interpretando que la pregunta es sobre la conversión de bytes al
str
tipo: es decir, bytes-y en Python 2 y Unicode-y en Python 3.Dado eso, el mejor enfoque que conozco es:
La siguiente afirmación será cierta para Python 2 o Python 3, suponiendo que no haya activado el
unicode_literals
futuro en Python 2:(O puede usar
''.join()
para omitir el espacio entre los bytes, etc.)fuente
se puede usar el especificador de
%x02
formato que formatea y genera un valor hexadecimal. Por ejemplo:fuente
res.upper()
Nuevo en Python 3.8, puede pasar un argumento delimitador a la
hex
función, como en este ejemplohttps://docs.python.org/3/library/stdtypes.html#bytes.hex
fuente
Si desea convertir b '\ x61' a 97 o '0x61', puede intentar esto:
Referencia: https://docs.python.org/3.5/library/struct.html
fuente