Как правильно преобразовать байты в шестнадцатеричную строку в Python 3?
Я вижу утверждения bytes.hex
метода, bytes.decode
кодеков и пробовал другие возможные функции наименьшего удивления безрезультатно. Я просто хочу, чтобы мои байты были шестнадцатеричными!
python
python-3.x
hex
Мэтт Джойнер
источник
источник
Ответы:
Начиная с Python 3.5 это, наконец, больше не неудобно:
и наоборот:
работает также с изменяемым
bytearray
типом.Ссылка: https://docs.python.org/3/library/stdtypes.html#bytes.hex
источник
bytes.fromhex()
также доступен на Python 3.0+ (не только 3.5+).bytes.hex()
только на Python 3.5+.Используйте
binascii
модуль:Посмотрите этот ответ: строка Python 3.1.1 в hex
источник
str
ноbytes
. Я знаю, что ОП кажется довольным ответом, но не будет лучше расширить этот ответ, включив в него.decode("ascii")
также преобразование его в «строку»bytes
. Если выprint(b'666f6f')
получитеb
в распечатке. Если ты,.decode("ascii")
то нет. Просто подумав о том, как те, кто на самом деле имеетbytes
(истинный двоичный файл с элементами> 128, а не строку ascii), хотят распечатать его..hex()
метод в Python 3.5+Python имеет стандартные кодеки от байтов к байту, которые выполняют удобные преобразования, такие как кавычка-печать (вписывается в 7-битную ascii), base64 (вписывается в алфавитно-цифровые символы), экранирование в шестнадцатеричном формате, сжатие gzip и bz2. В Python 2 вы можете сделать:
В Python 3
str.encode
/bytes.decode
строго для преобразования байтов <-> str. Вместо этого вы можете сделать это, что работает в Python 2 и Python 3 ( s / encode / decode / g для обратного):Начиная с Python 3.4, есть менее неудобная опция:
Эти кодеки misc также доступны внутри их собственных модулей (base64, zlib, bz2, uu, quopri, binascii); API менее согласован, но для кодеков сжатия он предлагает больше контроля.
источник
LookupError: unknown encoding: hex
binascii.hexlify(b'foo')
напрямуюработает в Python 3.3 (поэтому "hex_codec" вместо "hex").
источник
Метод
binascii.hexlify()
преобразуетсяbytes
вbytes
представляющую шестнадцатеричную строку ascii. Это означает, что каждый байт на входе будет преобразован в два символа ascii. Если вы хотите, чтобы правдаstr
, то вы можете.decode("ascii")
результат.Я включил фрагмент, который иллюстрирует это.
из шестнадцатеричной строки ,
"0a160a04"
чтобы можно вернуться кbytes
с ,binascii.unhexlify("0a160a04")
что дает обратноb'\n\x16\n\x04'
источник
Хорошо, следующий ответ немного выходит за рамки, если вы заботитесь только о Python 3, но этот вопрос является первым хитом Google, даже если вы не указали версию Python, поэтому вот способ, который работает как на Python 2, так и на Python 3 ,
Я также интерпретирую вопрос о преобразовании байтов в
str
тип: то есть bytes-y на Python 2 и Unicode-y на Python 3.Учитывая это, лучший подход, который я знаю, это:
Следующее утверждение будет верно для Python 2 или Python 3, при условии, что вы не активировали
unicode_literals
будущее в Python 2:(Или вы можете использовать,
''.join()
чтобы пропустить пробел между байтами и т. Д.)источник
можно использовать спецификатор
%x02
формата, который форматирует и выводит шестнадцатеричное значение. Например:источник
res.upper()
Новое в Python 3.8, вы можете передать аргумент разделителя
hex
функции, как в этом примереhttps://docs.python.org/3/library/stdtypes.html#bytes.hex
источник
Если вы хотите преобразовать b '\ x61' в 97 или '0x61', вы можете попробовать это:
Ссылка: https://docs.python.org/3.5/library/struct.html
источник