Используя функцию 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
НТН