Нет соответствующего «шестнадцатеричного» кода для 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]))
Или лучше, вы можете просто использовать шестнадцатеричный кодек. то есть.
>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'
Для распаковки вы можете закодировать результат обратно в шестнадцатеричный код аналогично
>>> data.encode('hex')
'abcdef12'
Тем не менее, обратите внимание, что для вашего примера, вероятно, нет необходимости проходить в обоих направлениях через шестнадцатеричное представление вообще при кодировании. Просто используйте бинарный дайджест md5 напрямую. то есть.
>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'
Это эквивалентно вашему представлению pack () ed. Чтобы получить шестнадцатеричное представление, используйте тот же метод распаковки выше:
>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'
[Редактировать]: обновлен для использования лучшего метода (шестнадцатеричный кодек)