将字节读入十六进制字符串的方法

时间:2015-02-27 15:46:48

标签: python hash binaryfiles

我正在从名为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', '')

这很有效,但我不禁感到我错过了什么。 缓冲区中的数据与最终字符串之间是否有更简单的转换

  

注意:我知道我有其他类型的摘要。但目前我对解决十六进制摘要的问题很感兴趣。

2 个答案:

答案 0 :(得分:3)

您可以使用hexlifybytes(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