Хранение целого числа в QByteArray, используя только 4 байта

Для представления целого числа требуется 4 байта. Как я могу хранить int в QByteArray так что это займет всего 4 байта?

  • QByteArray::number(..) преобразует целое число в строку, занимая более 4 байтов.
  • QByteArray((const char*)&myInteger,sizeof(int)) тоже не похоже на работу.

9

Решение

Есть несколько способов поместить целое число в 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));
17

Другие решения

@ 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.

0

По вопросам рекламы [email protected]