Domanda

Utilizzando la funzione PHP pack () , ho convertito una stringa in una rappresentazione binaria esadecimale:

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

La formattazione H * significa " Hex string, high nibble first " ;.

Per decomprimerlo in PHP, utilizzerei semplicemente la funzione unpack () con il formato H * bandiera.

Come decomprimerei questi dati in Python?

È stato utile?

Soluzione

C'è un modo semplice per farlo con il modulo binascii :

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

A meno che non fraintenda qualcosa sull'ordinamento degli stuzzichini (l'impostazione predefinita dello stuzzichino è l'impostazione predefinita), ciò dovrebbe essere perfettamente sufficiente!

Inoltre, gli oggetti hashlib.md5 di Python hanno un metodo hexdigest () per convertire automaticamente il digest MD5 in una stringa esadecimale ASCII, quindi questo metodo non è nemmeno necessario per i digest MD5. Spero che sia d'aiuto.

Altri suggerimenti

Non ci sono corrispondenti " hex nibble " codice per struct.pack, quindi dovrai prima comprimere manualmente in byte, come:

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 meglio, puoi semplicemente usare il codec esadecimale. vale a dire.

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

Per decomprimere, è possibile codificare il risultato in esadecimale in modo simile

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

Tuttavia, si noti che per il tuo esempio, probabilmente non è necessario eseguire il round trip attraverso una rappresentazione esadecimale durante la codifica. Basta usare il digest binario md5 direttamente. vale a dire.

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

Ciò equivale alla rappresentazione del pacchetto (). Per ottenere la rappresentazione esadecimale, utilizzare lo stesso metodo di decompressione sopra:

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

[Modifica]: aggiornato per utilizzare il metodo migliore (codec esadecimale)

In Python per questo usi il struct per questo.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top