Qt сериализация типа данных - PullRequest
0 голосов
/ 13 апреля 2020

Может ли кто-нибудь предоставить пример того, как можно сериализовать что-то вроде переменной QColor, а затем сохранить биты в QString / QBitArray / Vector (что бы ни было оптимальным). Я надеялся использовать QDataStream, но единственные примеры, которые я могу найти, включают запись данных в файл.

1 Ответ

0 голосов
/ 13 апреля 2020

QColor можно сериализовать в QDataStream напрямую, без каких-либо преобразований. QDataStream сам, в свою очередь, может записывать данные в любой подкласс QIODevice или в QByteArray.
См. Сериализация типов данных Qt .

Пример:

Сериализация цвета на QByteArray:

QColor color(Qt::red);

QByteArray ba;
QDataStream out(&ba, QIODevice::WriteOnly);
out << color; // serialized to ba

qDebug() << ba.size();

Сериализация на сокет TCP:

auto socket = new QTcpSocket;
socket->connectToHost(addr, port);
if(socket->waitForConnected())
{
    QDataStream out(socket);
    out << color; // written to socket
}

Qt имеет универсальные правила сериализации для основные основные типы данных. Вы можете сериализовать QColor напрямую на нужное io-устройство или на QByteArray.


Вы также можете представить цвет в виде строки. Но это не сериализация.

QString colorName = color.name(); // the name of the color in the format "#RRGGBB"; i.e. a "#" character followed by three two-digit hexadecimal numbers
qDebug() << colorName;

Об изменении конкретных бит в QByteArray. Посмотрите, как преобразовать QByteArray в QBitArray и наоборот: https://wiki.qt.io/Working_with_Raw_Data

Преобразование битов в байты (и обратно)

QByteArray bytes = ...;

// Create a bit array of the appropriate size
QBitArray bits(bytes.count()*8);

// Convert from QByteArray to QBitArray
for(int i=0; i<bytes.count(); ++i) {
    for(int b=0; b<8;b++) {
        bits.setBit( i*8+b, bytes.at(i)&(1<<(7-b)) );
    }
}

...

QBitArray bits = ...;

// Resulting byte array
QByteArray bytes;

// Convert from QBitArray to QByteArray
for(int b=0; b<bits.count();++b) {
    bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(7-(b%8))));
}

Не забывайте о порядке байтов: https://doc.qt.io/qt-5/qdatastream.html#setByteOrder

...