Как я могу распаковать двоичные данные в шестнадцатеричном формате в Python?

StackOverflow https://stackoverflow.com/questions/200738

  •  03-07-2019
  •  | 
  •  

Вопрос

Использование PHP пакет() функции я преобразовал строку в двоичное шестнадцатеричное представление:

$string = md5(time); // 32 character length
$packed = pack('H*', $string);

Форматирование H* означает «шестнадцатеричная строка, сначала старший полубайт».

Чтобы распаковать это в PHP, я бы просто использовал команду распаковать() функция с флагом формата H*.

Как мне распаковать эти данные в Python?

Это было полезно?

Решение

Есть простой способ сделать это с помощью binascii модуль:

>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'

Если я что-то не понимаю в порядке полубайтов (по умолчанию используется высокий полубайт), этого должно быть вполне достаточно!

Более того, Python hashlib.md5 объекты имеют hexdigest() метод для автоматического преобразования дайджеста MD5 в шестнадцатеричную строку ASCII, так что этот метод даже не нужен для дайджестов MD5.Надеюсь, это поможет.

Другие советы

Для struct.pack не существует соответствующего «шестнадцатеричного полубайтового» кода, поэтому вам придется либо вручную упаковать его в байты, например:

hex_string = 'abcdef12'

hexdigits = [int(x, 16) for x in hex_string]
data = ''.join(struct.pack('B', (high <<4) + low) 
               for high, low in zip(hexdigits[::2], hexdigits[1::2]))

Или, лучше, вы можете просто использовать шестнадцатеричный кодек.то есть.

>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'

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

>>> data.encode('hex')
'abcdef12'

Однако обратите внимание, что для вашего примера, вероятно, вообще нет необходимости проходить через шестнадцатеричное представление при кодировании.Просто используйте двоичный дайджест md5 напрямую.то есть.

>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'

Это эквивалентно вашему представлению package()ed.Чтобы получить шестнадцатеричное представление, используйте тот же метод распаковки, что описан выше:

>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

[Редактировать]:Обновлено для использования лучшего метода (шестнадцатеричный кодек).

В Python вы используете структура модуль для этого.

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

ХТХ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top