7

PHP のpack()関数を使用して、文字列をバイナリ 16 進数表現に変換しました。

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

H* フォーマットは、「16 進文字列、最初に上位ニブル」を意味します。

これを PHP でアンパックするには、H* フォーマット フラグを指定してunpack()関数を使用するだけです。

このデータを Python で展開するにはどうすればよいですか?

4

3 に答える 3

13

binasciiモジュールでこれを行う簡単な方法があります。

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

ニブルの順序付けについて誤解していない限り (ハイニブルが最初に設定されています... 異なるものは正気ではありません)、それで十分です。

さらに、Python のhashlib.md5オブジェクトにはhexdigest()、MD5 ダイジェストを ASCII 16 進文字列に自動的に変換するメソッドがあるため、このメソッドは MD5 ダイジェストには必要ありません。それが役立つことを願っています。

于 2008-10-14T14:15:26.693 に答える
11

struct.pack に対応する「16 進ニブル」コードはないため、最初に次のように手動でバイトにパックする必要があります。

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

または、16 進コーデックを使用することもできます。すなわち。

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

アンパックするには、同様に結果を16進数にエンコードできます

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

ただし、この例では、エンコード時に 16 進数表現を往復する必要はおそらくないことに注意してください。md5 バイナリ ダイジェストを直接使用するだけです。すなわち。

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

これは pack()ed 表現と同等です。16 進数表現を取得するには、上記と同じ unpack メソッドを使用します。

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

[編集]: より良い方法を使用するように更新 (16 進コーデック)

于 2008-10-14T11:59:32.960 に答える
8

Python では、これにstructモジュールを使用します。

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

于 2008-10-14T11:17:11.547 に答える