QBuffer是否以系统相关的字节顺序写入数据?

时间:2012-09-07 06:07:23

标签: qt

文档说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?

1 个答案:

答案 0 :(得分:1)

QBuffer documentation说:

  

QBuffer类为QByteArray提供QIODevice接口。

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

当你说

  

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

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


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

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

如果您使用的是具有不同字节顺序的计算机,则可以通过

获取生成的数组的不同值
char* data = &x;
qDebug()<< data[0];
qDebug()<< data[1];
qDebug()<< data[2];
qDebug()<< data[3];

查看QDataStream operator

的源代码
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;
}