Каков правильный способ преобразования байтов в шестнадцатеричную строку в Python 3?

Каков правильный способ преобразования байтов в шестнадцатеричную строку в Python 3?

Я вижу претензии метода bytes.hex, bytes.decode кодеки и пробовал другие возможные функции наименьшего удивления безрезультатно. Мне просто нужны мои байты как hex!

Ответ 2

Так как Python 3.5 это, наконец, уже не неудобно:

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

и наоборот:

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

работает также с изменяемым типом bytearray.

Ответ 3

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 менее согласован, но для кодеков сжатия он предлагает больше возможностей управления.

Ответ 4

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

работает в Python 3.3 (так "hex_codec" вместо "hex" ).

Ответ 5

Метод 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'

Ответ 6

Если вы хотите преобразовать 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'

Ссылка: https://docs.python.org/3.5/library/struct.html