2017-08-15 6 views
1

私はtcpソケットから生データとして(私は指定されたフォーマットを持っています)データを持っていて、そのデータに基づいてオブジェクトを作成します。フォーマットは次のようになります: ヘッダー[データのサイズとその他の情報]の24バイト、その後ヘッダーに指定されたデータの量です。QDataStreamを使った生データの逆シリアル化

私はオブジェクトとして読みたいと思っています(オブジェクトには、データが配置される動的サイズのデータ​​用のバッファがあります)。何らかの形でQDataStreamをオーバーライドすることは可能ですか、それをエレガントにラップするために何か他の方法ですか?私はトランザクションメソッドを利用して、データのパケット全体を読み込み、断片化していれば組み立てることはしません(ヘッダーの半分、または完全なデータ量ではありません)。

だから、基本的に私はこのようなSTHをしたいと思う:

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など)のために事前に定義されてい

関連する問題