表示一个整数需要 4 个字节。如何将 an 存储int
在 a 中QByteArray
以便只占用 4 个字节?
QByteArray::number(..)
将整数转换为字符串,因此占用超过 4 个字节。QByteArray((const char*)&myInteger,sizeof(int))
似乎也不起作用。
表示一个整数需要 4 个字节。如何将 an 存储int
在 a 中QByteArray
以便只占用 4 个字节?
QByteArray::number(..)
将整数转换为字符串,因此占用超过 4 个字节。QByteArray((const char*)&myInteger,sizeof(int))
似乎也不起作用。有几种方法可以将整数放入 aQByteArray
中,但以下通常是最干净的:
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 没有用他的第二种方法发布解决方案,所以这里是:
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 机器上。
最近我遇到了同样的问题,但有一点变化。我必须将一个无符号短向量存储到 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)) );
}