Хранение целого числа в 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)) );
}
Другие вопросы по тегам