[英]Qt binary reading error in qDatastream
我正在读一个由传感器产生的二进制文件。 我在以不同的精度(32或64)读取浮点数时遇到问题。 我可以在MATLAB(64位版本)中读取它们,但Qt(Windows上的32位版本)给出了错误的值。 我可以读到dtmth
(请参考下面的结构)。 在它之后,我获得baseline
值Inf
。 实际上该值为0
。 如你所见,我改变了MSB(LittleEndian)。 如果我保留BigEndian,我的基线为0
,但其他值则错误。 我的桌面是64位。
我检查了字节数,它们是正确的。 我认为问题是机器精度。
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);
非常感谢提前。
您使用的是哪个版本的Qt? 如果版本优于Qt 4.6,则默认精度为64位, 这意味着Qt将尝试将浮点数32作为浮点数64读取 。 您需要使用in.setFloatingPointPrecision ( QDataStream::SinglePrecision);
手动设置精度in.setFloatingPointPrecision ( QDataStream::SinglePrecision);
in >> p.filetype;
in >> p.projectid;
in >> p.datamin;
in >> p.dtyear;
in >> p.dtmth;
in.setFloatingPointPrecision(QDataStream::SinglePrecision);
in >> p.baseline;
in.setFloatingPointPrecision(QDataStream::DoublePrecision);
in >> p.startfrequ;
从您的评论看,这似乎是问题。 实际上,如果设置为单精度,并且尝试读取p.datamin
或p.startfrequ
(64位),则数据流将读取它们为32位浮点数。 并且不仅p.datamin
不正确,而且所有值都在它之后。
首先,检查我的建议是否在最后一行之后使用
if(in.status() == QDataStream::ReadCorruptData){
qDebug() << "still doesnt work";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.