Qt数据类型序列化

Qt data type serialization

有人可以提供一个示例,说明如何序列化 QColor 变量之类的东西,然后将这些位存储在 QString/QBitArray/Vector 中(无论是最佳的)。我希望使用 QDataStream,但我能找到的唯一示例包括将数据写入文件。

QColor 可以直接序列化为 QDataStream,无需任何转换。 QDataStream 本身可以将数据写入任何 QIODevice 子类或 QByteArray.
参见 Serializing Qt Data Types

示例:

将颜色序列化为 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