Как мне распаковать двоичные данные в шестнадцатеричном формате в Python? - PullRequest
6 голосов
/ 14 октября 2008

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 14 октября 2008

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

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

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

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

11 голосов
/ 14 октября 2008

Нет соответствующего «шестнадцатеричного» кода для 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:'

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

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

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

8 голосов
/ 14 октября 2008

В Python для этого используется модуль struct .

>>> 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

НТН

...