我有来自 tcp 套接字的数据作为原始数据(我有指定的格式(,然后基于该数据创建一个对象。格式是这样的: 24 字节的标头 [数据大小和其他一些信息],然后在标头中指定的数据量。
我想把它读成一个对象(对象有一个缓冲区,里面有动态大小的数据缓冲区,里面放着数据(。是否有可能以某种方式覆盖QDataStream或以其他方式优雅地包装它?我想利用事务方法来读取整个数据包,如果它们成块(半标头,或者只是不是全部数据(,则不注意组装它们。
所以基本上我想像这样做:
Event event; // my custom class
QDataStream dataStream(tcpSocket);
dataStream >> event;
dataStream.commit();
我相信运算符重载就是这种情况。我做了一个小的演示性例子:
class Test
{
public:
int i;
float f;
double d;
char empty[4];
int ii[3];
QString s;
public:
friend QDataStream& operator>>(QDataStream& in, Test& test);
friend QDataStream& operator<<(QDataStream& out, const Test& test);
};
QDataStream& operator>>(QDataStream& in, Test& test)
{
in >> test.i;
in.setFloatingPointPrecision(QDataStream::SinglePrecision);
in >> test.f;
in.setFloatingPointPrecision(QDataStream::DoublePrecision);
in >> test.d;
in.skipRawData(sizeof test.empty);
in.readRawData(reinterpret_cast<char*>(test.ii), sizeof test.ii);
in >> test.s;
return in;
}
QDataStream& operator<<(QDataStream& out, const Test& test)
{
out << test.i;
out.setFloatingPointPrecision(QDataStream::SinglePrecision);
out << test.f;
out.setFloatingPointPrecision(QDataStream::DoublePrecision);
out << test.d;
out.writeRawData(reinterpret_cast<const char*>(test.empty), sizeof test.empty);
out.writeRawData(reinterpret_cast<const char*>(test.ii), sizeof test.ii);
out << test.s;
return out;
}
然后你可以做:
outputStream
<< test1
<< test2
<< test3;
// ...
inputStream.startTransaction();
inputStream
>> test11
>> test22
>> test33;
inputStream.commitTransaction();
此外,这些运算符是为Qt基本容器(QVector
、QList
、QSet
等(预定义的。