Pregunta

Utilizando la función PHP pack () , he convertido una cadena en una representación hexadecimal binaria:

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

El formato H * significa "cadena hexadecimal, primer mordisco alto".

Para descomprimir esto en PHP, simplemente usaría la función unpack () con el formato H * bandera.

¿Cómo descomprimiría estos datos en Python?

¿Fue útil?

Solución

Hay una manera fácil de hacer esto con el módulo binascii :

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

A menos que esté malinterpretando algo sobre el orden de mordisco (el alto mordisco es el predeterminado), ¡eso debería ser perfectamente suficiente!

Además, los objetos hashlib.md5 de Python tienen un método hexdigest () para convertir automáticamente el resumen MD5 en una cadena hexadecimal ASCII, de modo que este método ni siquiera necesario para los digests MD5. Espero que ayude.

Otros consejos

No hay ningún " hexadecimal hexadecimal " código para struct.pack, por lo que primero deberá empaquetar manualmente en bytes, 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]))

O mejor, puedes usar el códec hexadecimal. es decir.

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

Para desempaquetar, puedes codificar el resultado de forma similar a hexadecimal

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

Sin embargo, tenga en cuenta que para su ejemplo, probablemente no sea necesario realizar el viaje de ida y vuelta a través de una representación hexadecimal en absoluto al codificar. Solo usa el compendio binario md5 directamente. es decir.

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

Esto es equivalente a su representación de pack () ed. Para obtener la representación hexadecimal, use el mismo método de descomprimir anterior:

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

[Editar]: actualizado para usar un método mejor (códec hexadecimal)

En Python usas el módulo struct para esto.

>>> 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top