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

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

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

форматирование H * означает "шестнадцатеричная строка, сначала высокий укус".

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

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

3 ответов


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

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

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

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


нет соответствующего кода "hex nibble" для 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'

чтобы распаковать, вы можете закодировать результат обратно в hex аналогично

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

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


в 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

HTH