gpt4 book ai didi

c++ - 使用 QDataStream 反序列化原始数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:35 27 4
gpt4 key购买 nike

我有来自 tcp 套接字的数据作为原始数据(我有指定的格式),然后基于该数据创建一个对象。格式是这样的:24 字节的 header [数据大小和一些其他信息],然后是 header 中指定的数据量。

我只想将它作为一个对象来读取(对象内部有一个用于数据的缓冲区,其中数据的大小是动态的)。是否有可能以某种方式覆盖 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 基本容器预定义的(QVectorQListQSet 等)

关于c++ - 使用 QDataStream 反序列化原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45691803/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com