12

整数を表すには 4 バイトかかります。を 4 バイトしか使用しないように格納するintにはどうすればよいですか?QByteArray

  • QByteArray::number(..)整数を文字列に変換するため、4 バイト以上を占めます。
  • QByteArray((const char*)&myInteger,sizeof(int))また、動作しないようです。
4

3 に答える 3

21

整数をに配置する方法はいくつかありますQByteArrayが、通常は次の方法が最もクリーンです。

QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);

stream << myInteger;

これには、バイト配列に複数の整数(または他のデータ型)をかなり便利に書き込むことができるという利点があります。また、を使用してデータのエンディアンを設定することもできますQDataStream::setByteOrder

アップデート

上記の解決策は機能しQDataStreamますが、整数を格納するために使用される方法は、Qtの将来のバージョンで変更される可能性があります。常に機能するようにする最も簡単な方法は、QDataStream:で使用されるデータ形式のバージョンを明示的に設定することです。

QDataStream stream(&byteArray, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_10); // Or use earlier version

QDataStreamまたは、使用を完全に避けて、 QBuffer:を使用することもできます。

#include <QBuffer>
#include <QByteArray>
#include <QtEndian>

...

QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
myInteger = qToBigEndian(myInteger); // Or qToLittleEndian, if necessary.
buffer.write((char*)&myInteger, sizeof(qint32));
于 2012-12-02T18:54:18.547 に答える
1

@Primož Kralj は、2 番目の方法で解決策を投稿できませんでした。

int myInt = 0xdeadbeef;
QByteArray qba(reinterpret_cast<const char *>(&myInt), sizeof(int));

qDebug("QByteArray has bytes %s", qPrintable(qba.toHex(' ')));

プリント:

QByteArray has bytes ef be ad de

x64 マシン上。

于 2019-01-01T01:38:59.383 に答える
0

最近、少しの違いで同じ問題に直面しました。unsigned short のベクトルを QByteArray に格納する必要がありました。QDataStream を使用したトリックは、不明な理由で機能しませんでした。だから、私の解決策は次のとおりです。

QVector<uint16_t> d={1,2,3,4,5};
QByteArray dd((char*)d.data(),d.size()*sizeof(uint16_t));

ベクトルを戻す方法は次のとおりです。

QVector<uint16_t> D;
for(int i=0; i<dd.size()/sizeof(uint16_t); ++i){
  D.push_back(*(uint16_t*)(dd.data()+i*sizeof(uint16_t)) );
}
于 2019-12-04T02:50:28.477 に答える