Python读取Qt QDataStream写入的二进制double类型数据异常问题排查
问题排查与解决
嘿,这个问题我遇到过!核心原因是Qt的QDataStream默认用大端字节序(Big-Endian)存储数据,但NumPy的np.fromfile默认跟随系统原生字节序——现在绝大多数现代系统都是小端(Little-Endian),字节序不匹配直接把原本的有效数据读成了一堆接近零的垃圾值。
补充个小细节:QDataStream存储double时会转成Qt自定义的qreal类型,但在绝大多数平台上qreal就是标准的64位double,所以不用纠结这个类型差异,重点搞定字节序就能解决问题。
快速修复:让NumPy按大端字节序读取
只需在np.fromfile里明确指定大端字节序的64位浮点数类型,一行代码就能修正:
import numpy as np with open("cont_points.dat", mode='rb') as f: # '>f8' 表示:>是大端字节序,f8是8字节浮点数(对应C++的double) controlP = np.fromfile(f, dtype='>f8') # 截取你需要的136个数值 controlP = controlP[:136] print(controlP)
更灵活的方案:用struct模块手动解析
如果需要更精细的控制(比如中途做数据校验),可以用Python内置的struct模块逐个读取解析:
import struct control_points = [] with open("cont_points.dat", mode='rb') as f: # 循环读取136个double,每个占8字节 for _ in range(136): byte_data = f.read(8) if not byte_data: break # 防止文件提前结束导致报错 # '>d' 指定大端字节序的double类型 value = struct.unpack('>d', byte_data)[0] control_points.append(value) print(control_points)
验证小技巧
你可以先检查第一个读取值:如果输出结果是-4.0,就说明字节序设置正确了,剩下的数值自然也会正常显示。
内容的提问来源于stack exchange,提问作者anirudh puligandla
相关产品推荐
相关产品推荐

