Подтвердить что ты не робот

Как использовать кодировку "hex" в Python 3.2 или выше?

В Python 2, чтобы получить строковое представление шестнадцатеричных цифр в строке, вы могли бы сделать

>>> '\x12\x34\x56\x78'.encode('hex')
'12345678'

В Python 3 это больше не работает (проверено на Python 3.2 и 3.3):

>>> '\x12\x34\x56\x78'.encode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: unknown encoding: hex

В SO существует как минимум один ответ, в котором упоминается, что кодек hex был удален в Python 3. Но тогда в соответствии с документами, он был повторно введен в Python 3.2 как "отображение байтов в байты".

Однако я не знаю, как заставить эти сопоставления "байт-байты" работать:

>>> b'\x12'.encode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'

И в документах не упоминается ни то, ни другое (по крайней мере, не там, где я смотрел). Я должен пропустить что-то простое, но я не понимаю, что это такое.

4b9b3361

Ответ 1

Вам нужно пройти через модуль codecs и hex_codec кодек (или его hex, если доступно *):

codecs.encode(b'\x12', 'hex_codec')

* Из документации: "Изменено в версии 3.4: Восстановление псевдонимов для двоичных преобразований".

Ответ 2

Еще один способ использования binascii.hexlify():

>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'

Ответ 3

Использование base64.b16encode():

>>> import base64
>>> base64.b16encode(b'\x12\x34\x56\x78')
b'12345678'

Ответ 4

binascii методы проще:

>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'