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

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

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

Форматирование H * означает «Hex string, high nibble first».

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

Как я распакую эти данные в Python?

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

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

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

Кроме того, объекты hashlib.md5 Python имеют метод 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:' 

Это эквивалентно представлению pack () 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 

НТН