Pythonでバイナリ16進形式のデータをアンパックするにはどうすればよいですか?
解決
binascii
モジュールでこれを行う簡単な方法があります:
>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'
ニブルの順序について誤解していない限り(最初にハイニブルがデフォルトです)、それで十分です!
さらに、Pythonの hashlib.md5
オブジェクトには hexdigest()
メソッドがあり、MD5ダイジェストをASCII 16進文字列に自動的に変換するため、このメソッドはMD5ダイジェストに必要です。お役に立てば幸いです。
他のヒント
対応する「六角ニブル」はありません。 struct.packのコードなので、次のように、最初に手動でバイトにパックする必要があります。
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進コーデック)
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
所属していません StackOverflow