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