Ответ 1
Используйте модуль binascii
:
>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'
Смотрите этот ответ: Строка Python 3.1.1 в шестнадцатеричном формате
Каков правильный способ преобразования байтов в шестнадцатеричную строку в Python 3?
Я вижу претензии метода bytes.hex
, bytes.decode
кодеки и пробовал другие возможные функции наименьшего удивления безрезультатно. Мне просто нужны мои байты как hex!
Используйте модуль binascii
:
>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'
Смотрите этот ответ: Строка Python 3.1.1 в шестнадцатеричном формате
Так как Python 3.5 это, наконец, уже не неудобно:
>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'
и наоборот:
>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'
работает также с изменяемым типом bytearray
.
Python имеет стандартные байты , которые выполняют удобные преобразования, такие как кавычки для печати (вписываются в 7bits ascii), base64 (вписываются в буквенно-цифровые символы), hex escaping, gzip и bz2. В Python 2 вы можете сделать:
b'foo'.encode('hex')
В Python 3, str.encode
/bytes.decode
строго предназначены для преобразований байтов ↔ str. Вместо этого вы можете сделать это, которое работает через Python 2 и Python 3 (s/encode/decode/g для обратного):
import codecs
codecs.getencoder('hex')(b'foo')[0]
Начиная с Python 3.4, существует менее неудобная опция:
codecs.encode(b'foo', 'hex')
Эти различные кодеки также доступны внутри своих модулей (base64, zlib, bz2, uu, quopri, binascii); API менее согласован, но для кодеков сжатия он предлагает больше возможностей управления.
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]
работает в Python 3.3 (так "hex_codec" вместо "hex" ).
Метод binascii.hexlify()
преобразует bytes
в bytes
, представляющий шестнадцатеричную строку ascii. Это означает, что каждый байт на входе будет преобразован в два символа ascii. Если вы хотите получить истинный str
, то вы можете .decode("ascii")
получить результат.
Я включил фрагмент, который иллюстрирует его.
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
из шестнадцатеричной строки "0a160a04"
может вернуться к bytes
с помощью binascii.unhexlify("0a160a04")
, которая возвращает b'\n\x16\n\x04'
Если вы хотите преобразовать b '\ x61' в 97 или '0x61', вы можете попробовать следующее:
[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'