Qt数据类型序列化



有人能提供一个例子,说明如何序列化像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

最新更新