Преобразование шестнадцатеричных строк в байты в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для тех, кто предпочитает сразу перейти к сути, примените метод bytes.fromhex() в Python:

Python
Скопировать код
hex_str = "68656c6f"
bytes_obj = bytes.fromhex(hex_str)
print(bytes_obj)  # b'hello'

Обратите внимание: перед преобразованием удалите префикс '0x' и пробелы.

Кинга Идем в IT: пошаговый план для смены профессии

Преобразование в зависимости от версии Python

В Python 3 конвертация шестнадцатеричной строки в байты легко выполняется с помощью bytes.fromhex():

Python
Скопировать код
hex_string = "4A6F7921"
bytes_result = bytes.fromhex(hex_string)

Пользователям Python 2.7 необходимо действовать по-другому:

Python
Скопировать код
hex_string = "4A6F7921"
bytes_result = hex_string.decode("hex")

Обработка нежелательных символов

Если шестнадцатеричная строка содержит пробелы или префикс 0x, их нужно удалить:

Python
Скопировать код
dirty_hex_string = "0x4a 6f 79 21"
clean_hex_string = dirty_hex_string.replace("0x", "").replace(" ", "")
bytes_result = bytes.fromhex(clean_hex_string)  # теперь строка готова к преобразованию

Визуализация

Шестнадцатеричные строки можно рассматривать как элементы конструктора, которые необходимо собрать в трехмерный объект:

Markdown
Скопировать код
В разобранном виде (шестнадцатеричная): "48656c6c6f"

Преобразуем в байты:

Python
Скопировать код
puzzle_pieces = bytes.fromhex("48656c6c6f")

В результате получаем:

Markdown
Скопировать код
В разобранном виде (шестнадцатеричная): "48656c6c6f" ➡️ 🤲 ➡️ Собранная мебель (байты): b'Hello'

Альтернативные методы преобразования

Применение binascii для получения байтов

Модуль binascii облегчает преобразование шестнадцатеричных чисел в байты и целочисленные значения:

Python
Скопировать код
import binascii

hex_string = "01FF"
bytes_result = binascii.unhexlify(hex_string)

# Преобразование в целое число
int_value = int(hex_string, 16)  # Результатом будет число 511.

Числовые преобразования с использованием struct.unpack

Преобразование байт в числа проводится с помощью struct.unpack, что дает возможность работать с данными на более низком уровне:

Python
Скопировать код
import struct

bytes_data = b'\x00\x01'
number = struct.unpack('!H', bytes_data)[0]

Не забывайте указывать порядок следования байтов (big-endian или little-endian).

Воспользоваться модулем codecs для декодирования байтов

codecs — это ещё один способ декодирования шестнадцатеричных строк в байты:

Python
Скопировать код
import codecs

hex_string = "deadbeef"
bytes_result = codecs.decode(hex_string, "hex")

Продвинутое преобразование и сложные случаи

При работе с большим объемом данных важен учет производительности

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

Понимание типов данных в struct

Контроль типов и размеров данных становится важным при использовании struct.unpack.

Изменение данных после преобразования

bytearray.fromhex() идеален для модификации данных после преобразования:

Python
Скопировать код
hex_string = "48656c6c6f"
byte_array = bytearray.fromhex(hex_string)

# Далее можно вносить изменения в byte_array

Полезные материалы

  1. Встроенные типы — Документация Python 3.12.2 — Обзор типа bytes.
  2. codecs — Реестр кодеков и базовые классы — Документация Python 3.12.2 — Подробнее о работе модуля кодеков в Python.
  3. python – В чем отличие между обычной строкой и байтовой строкой? – Stack Overflow — Обсуждение различий между буквенными строками и байт-строками.
  4. Python hex() — Руководство по работе с шестнадцатеричными числами.
  5. Программирование на Python/Байты – Wikibooks, открытые книги для открытого мира — Руководство по работе с байтами в Python.
  6. Обучение | DigitalOcean — Глубокое погружение в тему строк и байтов в Python.