Qt 以外の別のプログラムによって作成された定義済み構造のストリーミング バイナリ データ (QDataStream) を処理する必要があります。そのデータを解釈するためのベストプラクティスは何だろうか。データがテレグラムで次のように構造化されており (構造体定義が提供されている)、自分で変更できないとします。
4 バイトのヘッダー | 2 バイトのシーケンス番号 | 1 バイトのチェックサム | 10バイトデータ
「Telegram」クラスでデータを処理するには、次の可能性があります。
- Telegram クラスには、プライベート QByteArray メンバー変数があります。すべてのデータ (17 バイト) は、readRawData メソッドを使用してストリームから一度に読み取られ、そこに格納されます。変数は
return (array.at(4)<<8) + array.at(5)
、シーケンス番号のような public メソッドでアクセスおよび解釈されますが、あまり洗練されていません。 - Telegram クラスには、構造体と結合した public char[17] メンバー変数があります。すべてのデータは、readRawData を使用してストリームから読み取られ、そこに格納されます。後で変数にアクセスするとき、これは構造体に対してのみ行われ
telegramstruct.squenceNumber
ます。エンディアンやパディングなど、このメソッドには潜在的な問題があることがわかります。 - Telegram クラスには、 のような電報フィールドごとにプライベート メンバー変数があります
QString strHeader
。ストリームからテレグラムを読み取るとき、データはこれらの変数に直接保存されます。読み取りは readRawData または基本型の operator>> を使用して行われます。
処理するデータが多いため、コードはできるだけ高速にする必要があります。MinGW を使用して Windows で Qt 5.0.1 を使用しています。
私の質問:
- 上記の解決策のうち、ベスト プラクティスで高速なのはどれですか。それとも、より良い方法がありますか?
- 1 のように一度にすべてを読み取るのは、3 のように 4 バイト、2 バイト、1 バイトなどを読み取るよりも高速ですか?
- 1 と 3 では、定義済みの構造体で提供されたヘッダー ファイルを使用できません。それは悪い習慣でしょうか?
- QByteArray と構造体との一種の「ユニオン」を持つことは何とか可能ですか?
- ソリューション 3 でチェックサムを簡単に計算するにはどうすればよいですか?
ご意見やヒントをどうもありがとうございます。
クリス