Преобразование шестнадцатеричных строк в байты в Python
Быстрый ответ
Для тех, кто предпочитает сразу перейти к сути, примените метод bytes.fromhex()
в Python:
hex_str = "68656c6f"
bytes_obj = bytes.fromhex(hex_str)
print(bytes_obj) # b'hello'
Обратите внимание: перед преобразованием удалите префикс '0x' и пробелы.
Преобразование в зависимости от версии Python
В Python 3 конвертация шестнадцатеричной строки в байты легко выполняется с помощью bytes.fromhex()
:
hex_string = "4A6F7921"
bytes_result = bytes.fromhex(hex_string)
Пользователям Python 2.7 необходимо действовать по-другому:
hex_string = "4A6F7921"
bytes_result = hex_string.decode("hex")
Обработка нежелательных символов
Если шестнадцатеричная строка содержит пробелы или префикс 0x
, их нужно удалить:
dirty_hex_string = "0x4a 6f 79 21"
clean_hex_string = dirty_hex_string.replace("0x", "").replace(" ", "")
bytes_result = bytes.fromhex(clean_hex_string) # теперь строка готова к преобразованию
Визуализация
Шестнадцатеричные строки можно рассматривать как элементы конструктора, которые необходимо собрать в трехмерный объект:
В разобранном виде (шестнадцатеричная): "48656c6c6f"
Преобразуем в байты:
puzzle_pieces = bytes.fromhex("48656c6c6f")
В результате получаем:
В разобранном виде (шестнадцатеричная): "48656c6c6f" ➡️ 🤲 ➡️ Собранная мебель (байты): b'Hello'
Альтернативные методы преобразования
Применение binascii
для получения байтов
Модуль binascii
облегчает преобразование шестнадцатеричных чисел в байты и целочисленные значения:
import binascii
hex_string = "01FF"
bytes_result = binascii.unhexlify(hex_string)
# Преобразование в целое число
int_value = int(hex_string, 16) # Результатом будет число 511.
Числовые преобразования с использованием struct.unpack
Преобразование байт в числа проводится с помощью struct.unpack
, что дает возможность работать с данными на более низком уровне:
import struct
bytes_data = b'\x00\x01'
number = struct.unpack('!H', bytes_data)[0]
Не забывайте указывать порядок следования байтов (big-endian или little-endian).
Воспользоваться модулем codecs
для декодирования байтов
codecs
— это ещё один способ декодирования шестнадцатеричных строк в байты:
import codecs
hex_string = "deadbeef"
bytes_result = codecs.decode(hex_string, "hex")
Продвинутое преобразование и сложные случаи
При работе с большим объемом данных важен учет производительности
При обработке больших данных не забывайте об оптимизации производительности и обходе потенциальных узких мест.
Понимание типов данных в struct
Контроль типов и размеров данных становится важным при использовании struct.unpack
.
Изменение данных после преобразования
bytearray.fromhex()
идеален для модификации данных после преобразования:
hex_string = "48656c6c6f"
byte_array = bytearray.fromhex(hex_string)
# Далее можно вносить изменения в byte_array
Полезные материалы
- Встроенные типы — Документация Python 3.12.2 — Обзор типа
bytes
. - codecs — Реестр кодеков и базовые классы — Документация Python 3.12.2 — Подробнее о работе модуля кодеков в Python.
- python – В чем отличие между обычной строкой и байтовой строкой? – Stack Overflow — Обсуждение различий между буквенными строками и байт-строками.
- Python hex() — Руководство по работе с шестнадцатеричными числами.
- Программирование на Python/Байты – Wikibooks, открытые книги для открытого мира — Руководство по работе с байтами в Python.
- Обучение | DigitalOcean — Глубокое погружение в тему строк и байтов в Python.