Хранение целого числа в QByteArray, используя только 4 байта
Требуется 4 байта для представления целого числа. Как я могу хранить int
в QByteArray
так что это займет всего 4 байта?
QByteArray::number(..)
преобразует целое число в строку, занимая более 4 байтов.QByteArray((const char*)&myInteger,sizeof(int))
тоже не похоже на работу.
1 ответ
Есть несколько способов поместить целое число в 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 не удосужился опубликовать решение своим вторым методом, так что вот оно:
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)) );
}