二进制文件读取求助:编写struct.unpack格式字符串获取最新成交价
搞定二进制文件数据结构解包问题
嘿,我来帮你理清这个Python struct 解包的问题!首先得把那些格式符的含义搞明白,这是你解包出错的核心原因:
h:短整型(short),占2字节——你之前误以为它是long类型,其实不是,long对应的是ll:长整型(long),占4字节c:单个字符(char),占1字节Ns:长度为N的字节串(比如6s就是6字节的字符串,你理解的这部分是对的)<:表示小端字节序,也就是数据在文件里是按低位字节在前的方式存储的
先看你给出的原格式串 <hlhcl6s10s11s10s2s10schc,它对应的总字节数是66(2+4+2+1+4+6+10+11+10+2+10+1+2+1),但这和你描述的数据结构完全不匹配——你说数据结构是一个long类型加多个字符/字节串,那原格式串里的hlhcl(short+long+short+char+long)就占了13字节,明显多了几个数值类型字段,这肯定会导致解包错位。
根据你提到的预期字段序列c6s10s11s10s2s1s10s12s10s12s,再结合你说的有一个long类型字段,我给你整理正确的格式串思路:
- 先加字节序标记
<(原代码用了<,大概率数据是小端存储) - 把long类型的格式符
l放到对应字段的位置(假设是开头) - 后面跟上你列出的所有字符/字节串格式符
最终的格式串示例(如果long在开头):
fmt = '<lc6s10s11s10s2s1s10s12s10s12s'
你可以先计算这个格式串对应的总字节数,用struct.calcsize(fmt),结果应该是4+1+6+10+11+10+2+1+10+12+10+12=79字节,所以截取二进制数据的时候要改成b[i:i+79],而不是原来的66字节——这也是你之前解包出错的另一个关键原因:截取的长度和格式串不匹配。
给你一个调试验证的小代码,方便你核对字段:
import struct # 替换成符合文档的正确格式串 fmt = '<lc6s10s11s10s2s1s10s12s10s12s' # 确认格式串对应的字节数 print(f"格式串总字节数:{struct.calcsize(fmt)}") # 解包数据 data = struct.unpack(fmt, b[i:i+struct.calcsize(fmt)]) # 打印每个字段,对比文档看是否匹配 for idx, field in enumerate(data): print(f"字段{idx+1}: {field}")
如果「最新成交价」不是开头的long类型,而是在某个中间位置,你只需要把l移到对应的字段位置就行,核心原则就是每个字段的类型、长度必须和数据结构文档完全对应。
内容的提问来源于stack exchange,提问作者Mohit Aneja




