Как в QByteArray помещать и извлекать битовые поля без боли?

Есть QByteArray, как в него поместить, а потом извлечь битовые поля? Без побитовых сдвигов.


Ответы (2 шт):

Автор решения: Alexander Chernin

Что-то типа вот этого (по-памяти):

// Допустим 3 бита, второй параметр устанавливает их начальные значения в 0
QBitArray bits(3, false); 
a[0] = 1; a[1] = 0; a[2] = 1; 

// Буфер в который надо перегнать биты
QByteArray buffer;

// Вспомогательный поток на запись в буфер
QDataStream in(&buffer, QIODevice::WriteOnly);

// Пишем биты в буфер, при помощи потока
in << bits;

Чтение (где-то на другом конце земного шара):

// Читаем буфер с данными при помощи потока
QDataStream out(buffer);

//Битовый массив
QBitArray bits;

//Из буфера, при помощи потока читаем в битовый массив
out >> bits;
→ Ссылка
Автор решения: Роман Худобердин

Решил сам, но не без помощи сообщества.

Код структуры:

#pragma pack(push, 1) // работает без директив
struct srt_t // размер структуры 160 бит или 20 байт
{
    uint8_t one;
    uint8_t two;
    uint16_t three;
    uint32_t four;
    uint64_t five;
    uint32_t six: 16,
             seven: 16;
};
#pragma pack(pop)

Код кодирования структуры в QByteArray:

    srt_t ht{ 255, 255, 65535, 4294967295, 9223372036854775807, 65535, 65535 };

    QByteArray arr;
    arr.append( reinterpret_cast<char *>( &ht ), sizeof( ht ) );

Код декодирования в структуру:

    srt_t *pDev1 = reinterpret_cast<srt_t *>( arr.data() );

    qDebug() << pDev1->one;
    qDebug() << pDev1->two;
    qDebug() << pDev1->three;
    qDebug() << pDev1->four;
    qDebug() << pDev1->five;
    qDebug() << pDev1->six;
    qDebug() << pDev1->seven;
→ Ссылка