Как распаковать двоичные данные в шестнадцатеричном формате в 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