整数を表すには 4 バイトかかります。を 4 バイトしか使用しないように格納するint
にはどうすればよいですか?QByteArray
QByteArray::number(..)
整数を文字列に変換するため、4 バイト以上を占めます。QByteArray((const char*)&myInteger,sizeof(int))
また、動作しないようです。
整数を表すには 4 バイトかかります。を 4 バイトしか使用しないように格納するint
にはどうすればよいですか?QByteArray
QByteArray::number(..)
整数を文字列に変換するため、4 バイト以上を占めます。QByteArray((const char*)&myInteger,sizeof(int))
また、動作しないようです。整数をに配置する方法はいくつかあります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));
@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 マシン上。
最近、少しの違いで同じ問題に直面しました。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)) );
}