仅使用4个字节将整数存储到QByteArray

时间:2012-12-02 11:27:19

标签: c++ qt integer qbytearray

表示整数需要4个字节。如何在int中存储QByteArray,以便只需要4个字节?

  • QByteArray::number(..)将整数转换为字符串,因此占用的字节数超过4个字节。
  • QByteArray((const char*)&myInteger,sizeof(int))似乎也无效。

3 个答案:

答案 0 :(得分:17)

有几种方法可以将整数放入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));

答案 1 :(得分:0)

@PrimožKralj没用第二种方法发布解决方案,所以这里是:

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机器上

答案 2 :(得分:0)

最近,我遇到了相同的问题,但稍有改动。我必须将无符号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)) );
}