我正在从名为raw
的二进制缓冲区中读取16个字节:
md5 = list(struct.unpack('16B', raw.read(16)))
这会产生以下列表:
>>> print(md5)
>>> [25, 94, 158, 89, 108, 25, 125, 20, 138, 164, 84, 137, 250, 82, 150, 202]
我需要构建一个合适的md5字符串,然后我可以使用该字符串与hexdigest()
hashlib.md5()
进行比较
目前我这样做:
md5 = list(struct.unpack('16B', raw.read(16)))
for i, b in enumerate(md5):
md5[i] = hex(b)
md5 = ''.join(md5).replace('0x', '')
这很有效,但我不禁感到我错过了什么。 缓冲区中的数据与最终字符串之间是否有更简单的转换?
注意:我知道我有其他类型的摘要。但目前我对解决十六进制摘要的问题很感兴趣。
答案 0 :(得分:3)
您可以使用hexlify
将bytes
(Python 3)/二进制str
(Python 2)转换为十六进制字符串(Python上的字符串将为bytes
3,所以我们需要.decode('ascii')
匹配hexdigest
的{{1}}。
str
同样,您可以将原始字节与from binascii import hexlify
hex_string = hexlify(raw.read(16)).decode('ascii')
if md5.hexdigest() == hex_string:
...
进行比较; digest()
只是32字节可读表示的16字节值,即实际的MD5摘要总和。
hexdigest()
答案 1 :(得分:0)
Antti 的方法有效,但似乎不必要地复杂。直接使用bytes类型的WM_DEADCHAR
方法更直接:
raw.read(16).hex()
这从 Python 3.5 开始可用。反过来说,有 hex
。