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

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

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

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

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

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

3 Solutions collect form web for “Как я могу распаковать двоичные форматированные данные в формате 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 

НТН

  • Эквивалент Python для взлома PHP?
  • Как переносить устаревший веб-сайт Java / J2EE на современный язык сценариев (PHP, Python / Django и т. Д.)?
  • Эффективно использовать Google App Engine для отправки большого количества писем с помощью PHP?
  • Альтернатива PHP для ткани Python
  • Печать вывода Python с помощью кода PHP
  • Как правильно вызвать Python Pyro-клиент с помощью PHP и веб-сервера Apache?
  • PHP в HTML не работает с использованием Flask
  • mod_python, эквивалентный команде php exec ()
  • Запуск скрипта Python в PHP: захват всех выходов
  • Python - лучший язык программирования в мире.