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

134
03 апреля 2022, 18:30

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

Answer 1

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

// Допустим 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;
Answer 2

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

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

#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;
READ ALSO
Куча была повреждена

Куча была повреждена

При компилировании выдает ошибку Вызвано исключение по адресу 0x77C7F94D (ntdlldll) в test2

80
Заполнение колонки на основе соседней

Заполнение колонки на основе соседней

Подскажите пожалуйста, по решению вопросаУ меня есть колонка STATE (boolean), добавил колонку NAME (varchar)

122
Wordpress создание своей таблицы

Wordpress создание своей таблицы

Кто не будь знает по какой причине не работает конструкция

188