センサーによって生成されたバイナリ ファイルを読み込んでいます。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);
よろしくお願いします。