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

struct.error求助:unpack需要28261字节缓冲区

解决struct.error: unpack requires a buffer of X bytes问题

你的代码里存在两个关键问题导致了这个错误:

  1. 重复读取文件内容,导致指针偏移
    代码中在print(type(f.read(name_len)))这一行已经调用了一次f.read(name_len),这会把文件指针向后移动name_len个字节。当后续再次调用f.read(name_len)解析字段名时,实际读到的是文件中更靠后的内容,长度根本达不到name_len要求的字节数,直接触发struct.error。

  2. 长度字段的字节序可能不匹配
    你用struct.unpack('H', f.read(2))解析字段名长度,H默认是大端字节序,但如果你的目标文件是小端字节序存储的,会解析出错误的长度值(比如错误得到28261这样的大数),此时尝试读取这么多字节自然会失败。

修复后的代码

field_names = []
# 确保文件是以二进制模式打开的(open(..., 'rb'))
for i in range(obj["fields_cnt"]):
    print(i)
    # 根据文件实际字节序调整,比如小端用'<H',大端用'>H'或'H'
    name_len = struct.unpack('<H', f.read(2))[0]
    print(type(name_len))
    # 只读取一次字段名字节,避免重复移动指针
    name_bytes = f.read(name_len)
    print(type(name_bytes))
    print(name_len)
    print(f"实际读取字节数: {len(name_bytes)}")  # 调试用,确认长度是否匹配
    # 直接复用已读取的name_bytes,无需再次read
    field_names.append(
        struct.unpack(f'<{name_len}s', name_bytes)[0].decode('latin-1').strip('\x00'))
print("FIELD NAMES:")
print(field_names)

额外检查点

  • 确认文件打开方式是二进制模式('rb'),文本模式会篡改字节数据,导致长度计算错误。
  • 如果修改后仍然报错,检查name_len的实际值是否合理,比如是否远大于文件剩余字节数,这可能意味着你解析fields_cnt或者长度字段的逻辑本身就有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:43:12