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();

、そしてこのファイルを他のOS(win、linux、Mac OS)で読み取れるようにしたい。このコードは機能しますか、代わりに QDataStream を使用する必要がありますか?

4

1 に答える 1

1

QBufferのドキュメントには次のように書かれています:

QBuffer クラスは、QByteArray の QIODevice インターフェイスを提供します。

つまり、QByteArray下だけです。一方、 aQByteArrayは移植可能です。なぜなら、データをバイトの配列として見て、一度に 1 バイトずつ書き込めば問題ないからです。あなたのコードは動作します:

あなたが言う時

このファイルを他のOSで読み取れるようにしたい

あなたのファイルはあなたのプログラムによってのみ使用されますか、それともシステム内の他のアプリケーションによって使用されますか? 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 に答える