Шаг 109.
Python: сборник рецептов. Кодирование и обработка данных. Декодирование и кодирование шестнадцатеричных цифр

    На этом шаге мы рассмотрим способы решения этой задачи.

Задача

    Вам нужно декодировать строку шестнадцатеричных цифр в байтовую строку или закодировать байтовую строку в шестнадцатеричное представление.

Решение

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

>>> # Изначальная байтовая строка
>>> s = b'hello'
>>> # Закодировать в hex
>>> import binascii
>>> h = binascii.b2a_hex(s)
>>> h
b'68656c6c6f'
>>> # Декодировать обратно в байты
>>> binascii.a2b_hex(h)
b'hello'
>>>

    Похожую функцию можно найти в модуле base64. Например:

>>> import base64
>>> h = base64.b16encode(s)
>>> h
b'68656C6C6F'
>>> base64.b16decode(h)
b'hello'
>>> 


Обсуждение

    По большей части конвертирование в шестнадцатеричную форму и из шестнадцатеричной формы с помощью показанных приемов не составляет труда. Главная разница между этими двумя техниками заключается в приведении к регистру. Функции base64.b16decode() и base64.b16encode() работают только с шестнадцатеричными символами в верхнем регистре, а функции из модуля binascii могут работать с обоими регистрами.

    Также важно отметить, что вывод, который производят кодирующие функции, всегда является байтовой строкой. Чтобы принудительно вывести его в Unicode, вам придется добавить дополнительный шаг декодирования. Например:

>>> h = base64.b16encode(s)
>>> print(h)
b'68656C6C6F'
>>> print(h.decode('ascii'))
68656C6C6F
>>>

    При декодировании шестнадцатеричных цифр функции b16decode() и a2b_hex() принимают и байтовые, и юникодовые строки. Однако эти строки должны содержать только закодированные в ASCII шестнадцатеричные цифры.

    На следующем шаге мы рассмотрим кодирование и декодирование в Base64.




Предыдущий шаг Содержание Следующий шаг