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
有人可以提供一个示例,说明如何序列化 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