QT读写二进制与Python的异同
问题1:字节顺序
要把一个整型数int的数值写入二进制bin文件中。采用默认的方式写出,与Python的struct.pack得到的数据并不一致。如下所示
用Hex编辑器打开得到如下的结果
用Hex编辑器打开得到如下的结果
问题1的解决
通过Hex编辑器发现了,是因为QT默认是按照高位优先排序的,两个结果倒换过来就一样了。
因此,需要在QT的代码中加入以下字符:
// 设置低位优先,
aStream.setByteOrder(QDataStream::LittleEndian);
比如对于整数2020013,若按 big-endian(大端)顺序存储,则按0134、3AB1 的顺序存储,若按 little-endian(小端)顺序存储,则以B13A、3401 的顺序存储。
问题2:单双精度问题
把一个flloat数,用QT写发现出现了8个字节,但是用sizeof(float)只显示有4个字节。如下所示。
则出现如下所示二进制
而用Python则是4个字节
# An highlighted block
with open(path+filename, 'wb')as fp:
a=0.004999999888241291
version=struct.pack('f',a)
fp.write(version)
出现下面的二进制结果:
发现Python这个结果更合理一些,是4个字节。
问题2的解决
通过Hex编辑器发现了,是因为QT默认是双精度来输出的,4个字节就是单精度的话,需要把QT默认的精度改为单精度即可。
// 设置为单精度,
aStream.setFloatingPointPrecision(QDataStream::SinglePrecision);