Преобразование hex-кода ASCII в ASCII-строку на Python
Быстрый ответ
Для того чтобы преобразовать шестнадцатеричную строку в ASCII, сделайте следующее:
ascii_str = bytes.fromhex("68656c6c6f").decode() # преобразуем '68656c6c6f' в 'hello'
Используйте bytes.fromhex()
, а потом .decode()
на шестнадцатеричной строке для получения нужного результата.
Понимание кодировок символов
ASCII и Unicode — это системы кодирования символов с помощью числовых кодов. Шестнадцатеричное представление символа ASCII соответствует одному байту, то есть двум шестнадцатеричным цифрам, например, 68
для символа h
.
Методы преобразования Hex в ASCII
Использование модуля binascii
В качестве альтернативы bytes.fromhex()
можно использовать функцию binascii.unhexlify()
:
import binascii
ascii_str = binascii.unhexlify("68656c6c6f").decode('ascii') # переводим hex '68656c6c6f' в 'hello'
Ручное преобразование hex в целочисленное значение
Любителям сделать всё своими руками предлагается такой способ конвертирования шестнадцатеричных значений в символы ASCII:
ascii_str = ''.join(chr(int(''.join(pair), 16)) for pair in zip(*[iter("68656c6c6f")] * 2)) # для чего нужны библиотеки?
Декодирование не-ASCII кодировок
Возможны случаи, когда встречаются символы за пределами ASCII. В таких ситуациях вот простой способ обработать их:
non_ascii = bytes.fromhex("e38182e38184e38186").decode('utf-8') # переводим hex в японские символы 'あいう', демонстрируем полиглотство
Здесь мы явно декодируем в UTF-8, что позволяет обрабатывать многобайтные символы.
Избегание общих ошибок
Подготавливайте ваш шестнадцатеричный ввод
Важно убедиться, что в вашей шестнадцатеричной строке нет пробелов, префикса 0x
, и что это действительно легитимные шестнадцатеричные цифры:
clean_hex = "68656C6C6F".replace(' ', '').lower().lstrip('0x') # очищаем hex перед использованием
ascii_str = bytes.fromhex(clean_hex).decode('ascii')
Метод Python 2 устарел
Времена, когда в Python 2 использовался .decode('hex')
, ушли в прошлое. Сейчас пора перейти на Python 3.
Визуализация
Иллюстрируем процесс декодирования шестнадцатеричной строки в ASCII:
Шестнадцатеричная строка (🔠🔡): "48656C6C6F"
decoded = bytes.fromhex("48656C6C6F").decode('ascii') # Входим в шестнадцатеричные вода, выходим из аскишных!
Обычная строка ASCII (✉️): "Hello"
В итоге мы преобразовали мистический набор шестнадцатеричных цифр в привычное "Hello"!
Продвинутое преобразование hex
Для любителей функционального программирования
Функциональное программирование также предлагает инструменты для работы с Hex и ASCII:
from functools import partial
hex_to_int = partial(int, base=16) # каждому hex – быть int!
ascii_str = ''.join(map(chr, map(hex_to_int, ("68", "65", "6c", "6c", "6f")))) # map() внесет весь ужин
Богатство стандартной библиотеки
Для решения ваших задач часто достаточно стандартной библиотеки Python, и нет необходимости обращаться к сторонним.
Читаемость – главный приоритет
Понятный и простой код должен быть вашей главной целью. Выбирайте такой метод трансформации, который будет наиболее удобен для понимания и поддержания вашего кода.
Полезные материалы
- Документация Python | bytes.fromhex() – Как можно преобразовать hex в ASCII с помощью функции
bytes.fromhex()
. - Документация Python | binascii.unhexlify() – Альтернативные способы, позволяющие достичь таких же результатов с использованием
binascii.unhexlify()
. - Real Python | Всё о кодировке и декодировании – Глубокое погружение в мир кодировок и декодирования в Python.
- Практический Python | Использование метода decode() – Узнайте больше об искусстве использования метода
decode()
в Python. - DigitalOcean | Строки и байты в Python – Разъяснение различий между строками и байтами в Python.
- Перекодировка в Python | Использование метода encode() – Руководство для тех, кто собирается использовать метод
encode
.