0

尝试做最简单的事情。在 QT 中以二进制模式(无符号 16)写入一个数字并在 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并不是真的要创建可跨不同应用程序移植的流。(它意味着可以跨不同的操作系统和 Qt 版本移植,但总是被 Qt 使用。)格式不能保证是稳定的,所以它今天可以工作,但明天就会坏掉。从文档:

QDataStream 的二进制格式自 Qt 1.0 以来一直在发展,并且可能会继续发展以反映 Qt 中所做的更改。在输入或输出复杂类型时,确保读取和写入使用相同版本的流(version())非常重要。

如果要共享数据,请使用用于共享的输出格式,例如 XML、Json,或者在这种简单的情况下,只需将数字作为 ANSI 字符串写入文本文件即可。只需替换QTextStream.QDataStream

于 2012-06-20T12:24:28.253 回答