Pergunta

Usando o pacote PHP () função , eu ter convertido uma string em uma representação hexadecimal binário:

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

A H * formatação meios "cadeia Hex, alta mordidela primeiro".

Para descompactar isso em PHP, eu simplesmente usar o unpack () função com o H * formato bandeira.

Como eu poderia descompactar esses dados em Python?

Foi útil?

Solução

Há uma maneira fácil de fazer isso com o módulo binascii:

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

A menos que eu estou mal-entendido alguma coisa sobre a ordenação mordidela (high-mordidela primeiro é o padrão), que deve ser perfeitamente suficiente!

Além disso, objetos hashlib.md5 do Python tem um método hexdigest() para converter automaticamente o MD5 de uma string ASCII hex, de modo que este método não é mesmo necessário para digere MD5. Espero que ajude.

Outras dicas

Não há nenhum código correspondente "hex mordidela" para struct.pack, então você nem precisa manualmente embalar em bytes em primeiro lugar, como:

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]))

Ou melhor, você pode simplesmente usar o codec hex. ie.

>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'

Para descompactar, você pode codificar a parte de trás resultado em hexadecimal semelhante

>>> data.encode('hex')
'abcdef12'

No entanto, nota que o seu exemplo, provavelmente não há necessidade de levar o round-trip através de uma representação hexadecimal em tudo quando a codificação. Basta usar o md5 binário digerir diretamente. ie.

>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'

Este é equivalente ao seu pack () representação ed. Para obter a representação hexadecimal, use o mesmo método descompactar acima:

>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

[Edit]: Atualizado para usar melhor método (codec hex)

Em Python você usa o struct módulo para isso.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top