4

センサーによって生成されたバイナリ ファイルを読み込んでいます。float を異なる精度 (32 または 64) で読み取る際に問題が発生しています。MATLAB (64 ビット バージョン) でそれらを読み取ることができますが、Qt (Windows の 32 ビット バージョン) は間違った値を示しています。I can read until dtmth(以下の構造を参照してください) . その後、 の値Infを取得していますbaseline。この値は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.dataminor p.startfrequ(64 ビット) を読み取ろうとすると、データ ストリームはそれらを 32 ビット浮動小数点数として読み取ります。p.datamin正しくないだけでなく 、それ以降のすべての値になります。

まず、私の提案が機能したことを確認するには、最後の行の後に使用します

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