哈希数据digest转hexdigest方法及字节转字符串报错解决
解决二进制哈希字节转十六进制字符串的问题
嘿,这个问题我之前踩过坑!先给你理清楚为啥直接用bytes.decode()会报错:hashlib.sha256(data).digest()返回的是原始二进制哈希字节流,里面包含大量不可打印的控制字符或非ASCII字符(比如你示例里的\xce、\xbd这类),这些字节根本不是合法的UTF-8/ASCII编码内容,直接解码自然会抛出错误。
下面给你两种实用的解决方案:
方案1:直接生成十六进制摘要(推荐,能改调用逻辑的话优先用)
如果你的代码里可以直接调用hashlib的方法,那最简单的就是跳过digest(),直接用hexdigest()——它会直接输出你想要的十六进制字符串格式:
import hashlib data = b"your_input_content" hex_hash_result = hashlib.sha256(data).hexdigest() print(hex_hash_result) # 输出类似"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"的字符串
方案2:把已有的digest字节转换成十六进制字符串
如果已经拿到了digest()返回的bytes对象(比如你示例里的b'\xce\xe00-Y\x84M2\xbd\xca\x91\\\x82\x03\xddD\xb3?\xbb~\xdc'),可以用两种方式转换:
方法A:用bytes.hex()(Python 3.5+最便捷)
digest_bytes = b'\xce\xe00-Y\x84M2\xbd\xca\x91\\\x82\x03\xddD\xb3?\xbb~\xdc' hex_hash = digest_bytes.hex() print(hex_hash) # 输出对应的十六进制字符串:cee0302d59844d32bdca915c8203dd44b33fbb7edc
方法B:用binascii.hexlify()
import binascii digest_bytes = b'\xce\xe00-Y\x84M2\xbd\xca\x91\\\x82\x03\xddD\xb3?\xbb~\xdc' hex_hash = binascii.hexlify(digest_bytes).decode('ascii') print(hex_hash) # 和上面结果完全一致
这里hexlify()返回的还是bytes类型,所以用decode('ascii')转字符串就行——毕竟十六进制字符全在ASCII范围内,不会有解码问题。
总结下:原始digest字节本来就不是给人读的字符串,转成十六进制才是哈希值的标准可读格式,别再想着直接解码啦!
内容的提问来源于stack exchange,提问作者Semooze
相关产品推荐
相关产品推荐

