有人能提供一个例子,说明如何序列化像QColor变量这样的东西,然后将这些位存储在QString/QBitArray/Vector中(无论什么是最佳的(。我希望使用QDataStream,但我能找到的唯一例子包括将数据写入文件。
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