0

これまでで最も単純なことをしようとしています。バイナリモード(符号なし16)でQTに数値を書き込み、matlabでファイルを読み取ります。将来ファイルに番号を追加するので、追加モードを使用しますが、これを正しく行うことができないようです。

これはQTコードです:

QFile f("C:\\temp.dat");
f.open(QIODevice::WriteOnly | QIODevice::Append)
QDataStream out(&f);
out<<quint16(270);
f.close();

そしてこれはMatlabコードです:

fid = fopen('C:\\temp.dat');
F_nums = fread(fid,1,'*uint16');
fclose(fid);

非常に単純なようですが、数字を間違って読み取ります...

ありがとうございました!

4

2 に答える 2

3

問題は非常に単純です。ビッグエンディアンデータを書き込んでいますが(MSBが最初になります)、Matlabはデフォルトでリトルエンディアンデータを想定しています。修正は簡単です:

QFile f("C:\\temp.dat");
f.open(QIODevice::WriteOnly | QIODevice::Append)
QDataStream out(&f);
out.setByteOrder(QDataStream::LittleEndian); // *** set little endian byte order
out<<quint16(270);
f.close();
于 2012-06-20T17:49:13.947 に答える
1

QDataStream実際には、さまざまなアプリケーション間で移植可能なストリームを作成することを意図したものではありません。(さまざまなOSおよびQtバージョン間で移植可能であることが意図されていますが、常にQtによって使用されます。)この形式は安定しているとは限らないため、今日は機能しますが、明日は機能しなくなります。ドキュメントから:

QDataStreamのバイナリ形式はQt1.0以降進化しており、Qtで行われた変更を反映するために進化し続ける可能性があります。複合型を入力または出力するときは、同じバージョンのストリーム(version())が読み取りと書き込みに使用されていることを確認することが非常に重要です。

データを共有する場合は、XML、Jsonなどの共有を目的とした出力形式を使用するか、このような単純なケースでは、数値をANSI文字列としてテキストファイルに書き出します。の代わりQTextStreamQDataStream

于 2012-06-20T12:24:28.253 に答える