Wie kann ich ein Binär-Hex-formatierte Daten in Python entpacken?
Frage
Pack verwenden () Funktion habe ich einen String in eine binäre Hex-Darstellung umgewandelt:
$string = md5(time); // 32 character length
$packed = pack('H*', $string);
H * Formatierungsmittel "Hex-String, hohe Tetrade zuerst".
Um dies in PHP entpacken, würde ich einfach die Verwendung auspacken () Funktion mit dem H * Format Flagge.
Wie würde ich diese Daten in Python entpacken?
Lösung
Es gibt eine einfache Möglichkeit, dies mit dem binascii
Modul zu tun:
>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'
Wenn ich etwas über die knabbern Ordnung bin Mißverständnis (High-Nibble erste ist die Standardeinstellung), das sollte vollkommen ausreichend sein!
Darüber hinaus haben Pythons hashlib.md5
Objekte eine hexdigest()
Methode, um automatisch die MD5 in einen ASCII-Hex-String zu konvertieren zu verdauen, so dass diese Methode nicht einmal notwendig ist für MD5-Prüfsummen. Hoffe, das hilft.
Andere Tipps
Es gibt keinen entsprechenden „hex knabbern“ Code für struct.pack, so müssen Sie entweder manuell in Bytes packen zuerst, wie:
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]))
oder besser, können Sie einfach den Hex-Codec verwenden. dh.
>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'
Zum Auspacken können Sie das Ergebnis kodieren zurück in ähnlicher Weise verhexen
>>> data.encode('hex')
'abcdef12'
Beachten Sie jedoch, dass für Ihr Beispiel, gibt es wahrscheinlich keine Notwendigkeit, den Round-Trip durch eine hexadezimale Darstellung überhaupt zu nehmen, wenn codieren. Verwenden Sie einfach die md5 binäre direkt verdauen. dh.
>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'
Dies entspricht Ihr pack () ed Darstellung. Um die hexadezimale Darstellung zu erhalten, verwendet die gleiche auspacken oben beschriebene Methode:
>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'
[Bearbeiten]: Aktualisiert bessere Methode (hex-Codec) zu verwenden,
In Python verwenden Sie das struct Modul für diesen.
>>> 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