Question

À l'aide de la pack () fonction PHP, j'ai converti une chaîne en une représentation hexadécimale binaire:

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

Le formatage H * signifie "Chaîne hexadécimale, premier demi-octet",

.

Pour décompresser cela en PHP, j'utiliserais simplement la fonction unpack () au format H * drapeau.

Comment décompresser ces données en Python?

Était-ce utile?

La solution

Il existe un moyen simple de faire cela avec le module binascii :

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

À moins que je ne comprenne mal quelque chose à propos de la commande de nibble (high-nibble en premier est la valeur par défaut), cela devrait être parfaitement suffisant!

De plus, les objets hashlib.md5 de Python ont une méthode hexdigest () pour convertir automatiquement le condensé MD5 en chaîne hexadécimale ASCII, de sorte que cette méthode ne soit même pas nécessaire pour digérer MD5. J'espère que ça aide.

Autres conseils

Il n'y a pas de "nibble hexagonal" & correspondant; code pour struct.pack, vous aurez donc besoin soit d’emballer d’abord en octets, comme:

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 mieux, vous pouvez simplement utiliser le codec hexadécimal. c'est à dire.

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

Pour décompresser, vous pouvez coder le résultat en hexadécimal de manière similaire

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

Cependant, notez que pour votre exemple, il n’est probablement pas nécessaire de faire un aller-retour avec une représentation hexadécimale lors de l’encodage. Utilisez simplement le résumé binaire md5 directement. c'est à dire.

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

Ceci est équivalent à votre représentation pack (). Pour obtenir la représentation hexadécimale, utilisez la même méthode de décompression que ci-dessus:

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

[Modifier]: mise à jour pour utiliser une meilleure méthode (codec hexadécimal)

En Python, vous utilisez le module struct pour cela.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top