with - ¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?
python hex to string (6)
Desde Python 3.5 esto ya no es incómodo:
>>> b''/xde/xad/xbe/xef''.hex()
''deadbeef''
y reversa:
>>> bytes.fromhex(''deadbeef'')
b''/xde/xad/xbe/xef''
funciona también con el tipo mutable bytearray
.
¿Cuál es la forma correcta de convertir bytes a una cadena hexadecimal en Python 3?
Veo reclamos de un método bytes.hex
, bytes.decode
codecs, y he intentado other funciones posibles de asombro menor sin disponibilidad. ¡Solo quiero mis bytes como hex!
El método binascii.hexlify()
convertirá los bytes
a bytes
representan la cadena hexagonal ascii. Eso significa que cada byte en la entrada se convertirá en dos caracteres ascii. Si quieres un str
verdadero, entonces puedes .decode("ascii")
el resultado.
Incluí un fragmento que lo ilustra.
import binascii
with open("addressbook.bin", "rb") as f: # or any binary file like ''/bin/ls''
in_bytes = f.read()
print(in_bytes) # b''/n/x16/n/x04''
hex_bytes = binascii.hexlify(in_bytes)
print(hex_bytes) # b''0a160a04'' which is twice as long as in_bytes
hex_str = hex_bytes.decode("ascii")
print(hex_str) # 0a160a04
de la cadena hexadecimal "0a160a04"
para volver a los bytes
con binascii.unhexlify("0a160a04")
que devuelve b''/n/x16/n/x04''
Python tiene códecs estándar de bytes a bytes que realizan transformaciones convenientes como quoted-printable (se adapta a 7bits ascii), base64 (cabe en alfanuméricos), hex escaping, gzip y bz2 compression. 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 cambio, puede hacer esto, que funciona en Python 2 y Python 3 ( s / encode / decode / g para el inverso):
import codecs
codecs.getencoder(''hex'')(b''foo'')[0]
Comenzando con Python 3.4, hay una opción menos incómoda:
codecs.encode(b''foo'', ''hex'')
Estos códecs misc también son accesibles dentro de sus propios módulos (base64, zlib, bz2, uu, quopri, binascii); la API es menos consistente, pero para códecs de compresión ofrece más control.
Si quiere convertir b ''/ x61'' a 97 o ''0x61'', puede intentar esto:
[python3.5]
>>>from struct import *
>>>temp=unpack(''B'',b''/x61'')[0] ## convert bytes to unsigned int
97
>>>hex(temp) ##convert int to string which is hexadecimal expression
''0x61''
Referencia: https://docs.python.org/3.5/library/struct.html
Use el módulo binascii
:
>>> import binascii
>>> binascii.hexlify(''foo''.encode(''utf8''))
b''666f6f''
>>> binascii.unhexlify(_).decode(''utf8'')
''foo''
Ver esta respuesta: Python 3.1.1 string to hex
import codecs
codecs.getencoder(''hex_codec'')(b''foo'')[0]
funciona en Python 3.3 (por lo que "hex_codec" en lugar de "hex").