struct.error求助:unpack需要28261字节缓冲区
解决struct.error: unpack requires a buffer of X bytes问题
你的代码里存在两个关键问题导致了这个错误:
重复读取文件内容,导致指针偏移
代码中在print(type(f.read(name_len)))这一行已经调用了一次f.read(name_len),这会把文件指针向后移动name_len个字节。当后续再次调用f.read(name_len)解析字段名时,实际读到的是文件中更靠后的内容,长度根本达不到name_len要求的字节数,直接触发struct.error。长度字段的字节序可能不匹配
你用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
相关产品推荐
相关产品推荐

