Python3中拼接流读取字节与零字节后哈希的报错解决方法
解决方法
错误根源是混淆了字符串(str)和字节序列(bytes)类型:'\x00' * 32生成的是字符串,而stream.read()从二进制流读取的是字节序列,Python不允许直接拼接这两种类型。
以下是几种可行的修复方案:
方案1:统一为字节序列后拼接
直接生成32个零字节的字节序列,再和文件内容拼接后更新哈希:
import hashlib from io import BytesIO import sys if __name__ == "__main__": in_file = sys.argv[1] file_data = open(in_file, 'rb').read() stream = BytesIO(file_data) digest = hashlib.new('sha256') # 使用b'\x00'生成字节类型的零值,再与文件字节拼接 digest.update(b'\x00' * 32 + stream.read())
方案2:分两次调用update(更优)
hashlib的update()方法支持多次调用,多次写入的效果等价于一次性写入拼接后的内容,这种方式还能避免大文件场景下的内存压力(无需一次性拼接大字节序列):
import hashlib from io import BytesIO import sys if __name__ == "__main__": in_file = sys.argv[1] file_data = open(in_file, 'rb').read() stream = BytesIO(file_data) digest = hashlib.new('sha256') digest.update(b'\x00' * 32) # 先写入32个零字节 digest.update(stream.read()) # 再写入文件内容
补充优化(可选)
如果处理大文件,没必要一次性把整个文件读入内存,可以直接操作文件流,减少内存占用:
import hashlib import sys if __name__ == "__main__": in_file = sys.argv[1] digest = hashlib.new('sha256') digest.update(b'\x00' * 32) # 分块读取大文件,避免内存溢出 with open(in_file, 'rb') as f: while chunk := f.read(4096): digest.update(chunk)
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

