2

文档说 QDataStream 以独立于系统的方式写入数据,但对 QBuffer 只字未提。我开发了一个程序,将数据保存在这样的文件中:

QByteArray a;
QBuffer b(&a);
b.open(QIODevide::WriteOnly);
quint32 x = 1;
b.write((char*)&x, sizeof(x));
b.close();
QFile f(...);
f.open(QIODevide::WriteOnly);
f.write(a.constData(), a.size());
f.close();

,我希望这个文件可以在任何其他操作系统(win、linux、Mac OS)中读取。这段代码会起作用还是我必须改用 QDataStream ?

4

1 回答 1

1

QBuffer文档说:

QBuffer 类为 QByteArray 提供 QIODevice 接口。

即它只是一个QByteArray下面。另一方面, aQByteArray是可移植的,因为只要您将数据视为字节数组并一次写入一个字节就可以了。您的代码将起作用:

当你说

我希望在任何其他操作系统中读取此文件

您的文件是仅由您的程序使用还是将由系统中的其他应用程序使用?QDataStream提供了更好的功能I\O,您仍然可以利用它。


它将是特定于平台的。x内存中的表示取决于字节序。它不会出现在 中QBuffer,但是当你这样做时:

b.write((char*)&x, sizeof(x));

如果您在不同字节序的机器上,您将通过执行获得结果数组的不同值

char* data = &x;
qDebug()<< data[0];
qDebug()<< data[1];
qDebug()<< data[2];
qDebug()<< data[3];

看一下QDataStream算子的源码

QDataStream &QDataStream::operator<<(qint32 i){

  CHECK_STREAM_WRITE_PRECOND(*this)
  if (!noswap) {
      i = qbswap(i);
  }
   if (dev->write((char *)&i, sizeof(qint32)) != sizeof(qint32))
       q_status = WriteFailed;
   return *this;
}
于 2012-09-07T08:06:48.173 回答