gpt4 book ai didi

c++ - qDatastream中的Qt二进制读取错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:42 25 4
gpt4 key购买 nike

我正在读取一个由传感器生成的二进制文件。我在读取不同精度(32 或 64)的 float 时遇到问题。我可以在 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位,which means Qt will try to read your float 32 as a float 64 .您需要使用 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.dataminp.startfrequ(64 位),那么数据流会将它们读取为 32 位 float 。不仅 p.datamin 不正确,它后面的所有值也不正确。

首先,在最后一行之后检查我的建议是否有效

      if(in.status() == QDataStream::ReadCorruptData){
qDebug() << "still doesnt work";
}

关于c++ - qDatastream中的Qt二进制读取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15897146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com