我正在读取由传感器生成的二进制文件。我在读取浮点时遇到了不同的精度问题(32或64)。我可以在MATLAB(64位版本)中阅读它们,但Qt(Windows上的32位版本)会给出错误的值。我可以阅读到dtmth
(请参阅下面的结构)。之后,我得到baseline
的价值Inf
。事实上这个值是0
。正如你所看到的,我改变了MSB(LittleEndian)。如果我保留BigEndian,则基线为0
,但其他值则是错误的。我的桌面是64位。qDatastream中的Qt二进制读取错误
我检查了字节数,它们是正确的。我认为问题是机器精度。
QDataStream in(&file);
in.setByteOrder(QDataStream::LittleEndian);
params p;
in >> p.filetype;
in >> p.projectid;
in >> p.datamin;
in >> p.dtyear;
in >> p.dtmth;
in >> p.baseline;
in >> p.startfrequ;
其中P是一个结构定义为:
struct params
{
quint8 filetype;
quint16 projectid;
double datamin;
quint16 dtyear;
quint8 dtmth;
float baseline;
double startfrequ;
};
我可以在MATLAB阅读。我的matlab是64位版本,我读取的数据类型如下:
MATLAB:
uint8 filetype;
uint16 projectid;
float64 datamin;
uint16 dtyear;
uint8 dtmth;
float32 baseline;
float64 startfrequ;
让我知道如果我错过了任何细节。
编辑:
读文件:
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QString(),
tr("Raw Files (*.msr);;All files (*.*)"));
if (!fileName.isEmpty()) {
qDebug("Attempting to open file..");
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
return;
}
QDataStream in(&file);
非常感谢提前。
也正确读取'datamin'? – UmNyobe 2013-04-09 08:43:38
再次@UmNyobe。那是我困惑的地方。我正在阅读正确的字节数,并且这两个值都是0.所以我不确定它们是否正确。但后来我正确读数。此外,基线的价值也是0,我得到的是Inf。 – Naresh 2013-04-09 08:48:25
是否在二进制模式下打开'file'?在Windows上,您必须区分二进制和文本模式;文本模式在输入时将“0x13 0x10”对改为“0x10”,因此可能会破坏数据。 – Angew 2013-04-09 08:53:06