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 進コーデック)