php écrire Comment puis-je décompresser les données hexadécimales binaires en Python?




transformer un nombre binaire en decimal python (3)

En utilisant la fonction PHP pack () , j'ai converti une chaîne en une représentation binaire hexadécimale:

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

Le formatage H * signifie "Chaîne hexadécimale, haute grignotée en premier".

Pour décompresser ceci en PHP, j'utiliserais simplement la fonction unpack () avec l'indicateur de format H *.

Comment décompresser ces données en Python?


Il n'y a pas de code "hexagone hexadécimal" correspondant pour struct.pack, donc vous devrez d'abord les empaqueter manuellement en octets, comme ceci:

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 encoder le résultat en hexadécimal

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

Cependant, notez que pour votre exemple, il n'est probablement pas nécessaire de prendre l'aller-retour à travers une représentation hexadécimale lors de l'encodage. Utilisez simplement le condensé 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 de pack () ed. Pour obtenir la représentation hexadécimale, utilisez la même méthode de décompression ci-dessus:

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

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


Il y a un moyen facile de le faire avec le module binascii :

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

À moins que je ne comprenne quelque chose à propos de la commande de grignotage (le grignotage 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 une chaîne hexadécimale ASCII, de sorte que cette méthode n'est même pas nécessaire pour les condensés MD5. J'espère que cela pourra aider.


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





hex