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

Method for reading bytes into an hexdigest string

我正在从名为 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 字符串,然后我可以用它来与 hashlib.md5()

中的任何 hexdigest() 进行比较

目前我是这样做的:

md5 = list(struct.unpack('16B', raw.read(16)))
for i, b in enumerate(md5):
    md5[i] = hex(b)
md5 = ''.join(md5).replace('0x', '')

这行得通,但我忍不住觉得我错过了什么。 缓冲区中的数据和最终字符串之间是否有更直接的转换

Note: I understand I have other types of digests. But currently I'm interested in solving the problem for an hexadecimal digest.

您可以使用hexlifybytes(Python3)/二进制str(Python2)转换成十六进制字符串(字符串将是 bytes on Python 3,所以我们需要 .decode('ascii') 来匹配 hexdigeststr).

from binascii import hexlify
hex_string = hexlify(raw.read(16)).decode('ascii')

if md5.hexdigest() == hex_string:
    ...

同样,您可以将原始字节与 digest() 进行比较; hexdigest() 只是 16 字节值的 32 字符可读表示,即实际的 MD5 摘要总和。

the_bytes = raw.read(16)
if md5.digest() == the_bytes:
    ...

Antti 的方法有效,但似乎不必要地复杂。直接使用 bytes 类型的 hex 方法更直接:

raw.read(16).hex()

自 Python 3.5 起可用。反过来,有bytes.fromhex.