将字节读入十六进制字符串的方法
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.
您可以使用hexlify
将bytes
(Python3)/二进制str
(Python2)转换成十六进制字符串(字符串将是 bytes
on Python 3,所以我们需要 .decode('ascii')
来匹配 hexdigest
即 str
).
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
.
我正在从名为 raw
:
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.
您可以使用hexlify
将bytes
(Python3)/二进制str
(Python2)转换成十六进制字符串(字符串将是 bytes
on Python 3,所以我们需要 .decode('ascii')
来匹配 hexdigest
即 str
).
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
.