如何将十六进制摘要转换为摘要,反之亦然?

11

我想将哈希值存储为二进制(64字节),但对于任何类型的API(Web服务),我都想以字符串形式传递它们。hashlib.hexdigest()会给我一个字符串,而hashlib.digest()会给我二进制数据。但是,如果例如我从磁盘中读取了二进制版本,我该如何将其转换为字符串呢?如果我从Web服务中读取字符串,又该如何将其转换为二进制呢?

4个回答

10
你可能需要查看 binascii 模块,具体来说是 hexlifyunhexlify 函数。

或者您可以使用内置的 bytes.fromhex() 函数。 - young_souvlaki

7

在2.x版本中,您可以使用str.decode('hex')str.encode('hex')将原始字节与十六进制字符串相互转换。在3.x版本中,您需要使用binascii模块。


4

您可以从字符串版本开始传递和显示:

>>> import hashlib
>>> string_version = hashlib.md5(b'hello world').hexdigest()

将其转换为二进制以写入磁盘:

>>> save_as_binary = string_version.encode('utf-8')
>>> print(save_as_binary)
b'5eb63bbbe01eeed093cb22bb8f5acdc3'

从磁盘中读取时,将其转换回字符串:

>>> back_to_string = save_as_binary.decode('utf-8')
>>> print(back_to_string)
5eb63bbbe01eeed093cb22bb8f5acdc3

6
澄清一下:“hashlib.md5(b'hello world').hexdigest().decode('hex') == hashlib.md5(b'hello world').digest()” 的意思是两者相等。 - Ben
@Ben 非常感谢。这节省了我很多时间。我正在处理 AWS S3,并试图弄清楚如何将 ETag 从字符串转换为二进制再转换回字符串。网上有很多答案,但对我来说都不起作用。但是当我尝试了你的答案后,它完美地解决了我的问题。所以非常感谢你! - anirudha sonar
2
语句 string_version.encode('utf-8') 并不会提供 hexdigest 的二进制解释,它只提供了一个十六进制字符串的二进制字符串。save_as_binary 与所要求的 digest() 不同。 - Johannes Overmann

0
一些现有的答案在这里都没有抓住重点。digest是字节,而hexdigest是一个字符串。
>>> from hashlib import md5
>>> h = md5(b"hello world")
>>> h.digest()
b'^\xb6;\xbb\xe0\x1e\xee\xd0\x93\xcb"\xbb\x8fZ\xcd\xc3'
>>> h.hexdigest()
'5eb63bbbe01eeed093cb22bb8f5acdc3'

从字节(bytes)转换为十六进制字符串(hexdigest),使用bytes.hex
>>> h.digest().hex()
'5eb63bbbe01eeed093cb22bb8f5acdc3'

从十六进制字符串(hexdigest)转换为字节串(digest),请使用bytes.fromhex函数:
>>> bytes.fromhex(h.hexdigest())
b'^\xb6;\xbb\xe0\x1e\xee\xd0\x93\xcb"\xbb\x8fZ\xcd\xc3'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接