2017-08-15 30 views
1

我有來自tcp套接字的數據作爲原始數據(我有一個指定的格式),然後根據該數據創建一個對象。格式如下: 24個字節的標題[數據大小和其他信息],然後在標題中指定的數據量。使用QDataStream反序列化原始數據

我想只讀它作爲一個對象(對象有一個緩衝區內的數據與動態大小的數據放入)。是否有可能以某種方式覆蓋QDataStream或以其他方式優雅地包裝它?我希望利用事務方法來讀取整個數據包,如果它們分成幾部分(半個頭部,或者不是全部數據量),就不會考慮將它們組合起來。

所以基本上我想做某事像這樣:

Event event;   // my custom class 
QDataStream dataStream(tcpSocket); 

dataStream >> event; 
dataStream.commit(); 

回答

0

我相信這是對運算符重載的情況。我做了一個小的示範例子:

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等)