[英]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.