4

我正在读取由传感器生成的二进制文件。我在读取具有不同精度(32 或 64)的浮点数时遇到问题。我可以在 MATLAB(64 位版本)中读取它们,但 Qt(Windows 上的 32 位版本)给出了错误的值。我可以阅读直到dtmth(请参考下面的结构)。在它之后,我得到Infbaseline. 这个值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);

提前非常感谢。

4

1 回答 1

3

您使用的是哪个版本的 Qt?如果版本优于 Qt 4.6,则默认精度为 64 位,这意味着 Qt 将尝试将您的 float 32 读取为 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 位浮点数。不仅 p.datamin会不正确,而且之后的所有值都会不正确。

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

      if(in.status() == QDataStream::ReadCorruptData){
            qDebug() << "still doesnt work";
      }
于 2013-04-09T08:50:56.007 回答