You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:55:24