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

Python write()无法写入完整内容,超2MB十六进制转文件故障排查

解决大文件十六进制数据转存不完整的问题

原代码一次性将整个十六进制字符串解码为字节对象并写入文件,当数据超过2MB时,内存占用过高会导致系统隐性截断数据,或因内存限制无法完整处理全部内容。

修改思路

通过分块处理十六进制数据,每次仅解码并写入一小部分内容,避免一次性加载全部数据到内存,从而支持大文件的处理。同时使用with语句自动管理文件资源,避免资源泄漏。

修改后的代码

import os

def save_image(filename, hex_imgdata, chunk_size=4096):
    # 用with语句自动处理文件打开/关闭,无需手动调用close
    mode = "wb" if os.path.exists(filename) else "xb"
    with open(filename, mode) as current_file:
        # 分块遍历十六进制字符串,每次处理chunk_size长度的片段
        for i in range(0, len(hex_imgdata), chunk_size):
            chunk = hex_imgdata[i:i+chunk_size]
            # 确保十六进制片段为偶数长度,避免bytes.fromhex报错
            if len(chunk) % 2 != 0:
                chunk = chunk[:-1]
            decoded_chunk = bytes.fromhex(chunk)
            current_file.write(decoded_chunk)
    print(f"Saved {filename}")

example_hex = "A2C688B272"

if not os.path.exists("extracted"):
    os.mkdir("extracted")
os.chdir("extracted")

save_image(filename="example.png", hex_imgdata=example_hex)

额外优化:从十六进制文件直接分块处理

如果你的十六进制数据是存储在文件中而非内存变量,建议直接分块读取文件处理,进一步降低内存占用:

import os

def save_from_hex_file(hex_file_path, output_filename, chunk_size=4096):
    with open(hex_file_path, "r") as hex_file, open(output_filename, "wb") as out_file:
        while True:
            # 每次从十六进制文件读取chunk_size长度的内容
            chunk = hex_file.read(chunk_size)
            if not chunk:
                break
            # 处理奇数长度的末尾块
            if len(chunk) % 2 != 0:
                chunk += "0"
            decoded_chunk = bytes.fromhex(chunk)
            out_file.write(decoded_chunk)
    print(f"Saved {output_filename}")

# 使用示例
# save_from_hex_file("large_file.hex", "extracted_large.png")

关键改进点

  • 分块处理:每次仅处理固定长度的十六进制片段,大幅降低内存占用,避免大内存对象导致的截断问题。
  • with语句:自动管理文件生命周期,确保文件正确关闭,避免数据未刷新到磁盘。
  • 长度校验:处理十六进制片段的奇数长度情况,避免bytes.fromhex抛出异常。

内容的提问来源于stack exchange,提问作者YupYupTRP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:18:42