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

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

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

Ответы [ 8 ]

279 голосов
/ 22 марта 2016

Начиная с Python 3.5 это, наконец, больше не неудобно:

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

и наоборот:

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

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

93 голосов
/ 08 июля 2011

Используйте модуль binascii:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

Смотрите этот ответ: Python 3.1.1 строка в шестнадцатеричный код

37 голосов
/ 16 апреля 2013

Python имеет байты к байтам стандартные кодеки , которые выполняют удобные преобразования, такие как кавычка-печать (подходит для 7-битной таблицы), base64 (подходит для алфавитно-цифровых символов), экранирование шестнадцатеричных кодов, сжатие 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')

Эти кодеки misc также доступны внутри их собственных модулей (base64, zlib, bz2, uu, quopri, binascii); API менее согласован, но для кодеков сжатия он обеспечивает больший контроль.

7 голосов
/ 18 марта 2014
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]

работает в Python 3.3 (поэтому «hex_codec» вместо «hex»).

5 голосов
/ 09 июня 2015

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

3 голосов
/ 16 июня 2018

ОК, следующий ответ несколько выходит за рамки, если вы заботитесь только о Python 3, но этот вопрос является первым хитом Google, даже если вы не указали версию Python, поэтому вот способ, который работает на обоих Python 2 и Python 3.

Я также интерпретирую вопрос о преобразовании байтов в тип str: то есть bytes-y на Python 2 и Unicode-y наPython 3.

Учитывая это, лучший из известных мне подходов:

import six

bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))

Следующее утверждение будет верным для Python 2 или Python 3, при условии, что вы не активировали unicode_literals будущее в Python 2:

assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'

(Или вы можете использовать ''.join(), чтобы пропустить пробел между байтами и т. Д.)

2 голосов
/ 10 июля 2018

можно использовать спецификатор формата %x02, который форматирует и выводит шестнадцатеричное значение.Например:

>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
...     res += "%02x" % b
... 
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736
0 голосов
/ 08 мая 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...