0

beejのネットワーキングガイドには、シリアル化のためのデータのマーシャリングまたはパッキングのセクションがあり、データのパッキングとアンパックのさまざまな機能(int、float、double ..etc)について説明しています。

以下に定義するようにunion(floatとdoubleについても同様に定義できます)を使用し、packおよびunpack関数よりもinteger.iのパックバージョンとしてinteger.packを送信する方が簡単です。

union _integer{
  char pack[4];
  int i;
}integer;
  1. 組合が悪い選択である理由を誰かが明らかにすることができますか?

  2. データをパックするより良い方法はありますか?

4

3 に答える 3

3

コンピュータが異なれば、データのレイアウトも異なる場合があります。古典的な問題はエンディアンです(あなたの例では、pack [0]にMSBまたはLSBがあるかどうか)。このようなユニオンを使用すると、データを、それを生成したコンピューター上の特定の表現に結び付けます。

データをマーシャリングする他の方法を確認したい場合は、Boostシリアル化Googleprotobufを確認してください。

于 2010-02-25T19:48:54.873 に答える
1

バッファreinterpret_castにachar*またはamemcpyを実行しないのはなぜですか?charそれらは基本的に同じものであり、混乱が少ないです。

あなたのアイデアはうまくいくので、必要に応じてそれを選んでください。しかし、クリーンなコードは幸せなコードだと思います。私の仕事を理解しやすいほど、誰か(私の将来の自己のような)がそれを壊す可能性は低くなります。

また、ユニオンに配置できるのはPOD(プレーンな古いデータ)タイプのみであることに注意してください。これにより、より直感的なアプローチにはないユニオンアプローチにいくつかの制限が課せられます。

于 2010-02-25T19:48:54.410 に答える
1

ユニオントリックが機能することは保証されていませんが、通常は機能します。charデータを設定し、intを読み取ろうとしたときに0を読み取ったり、その逆を行ったりすることは、(標準に従って)完全に有効です。unionは、キャスティングの代わりではなく、メモリのマイクロ最適化として設計されました。

この時点で、通常、変換を便利なオブジェクトにまとめるか、reinterpret_castを使用します。少しかさばる、または醜い...しかし、データをパックするとき、これらのどちらも必ずしも悪いことではありません。

于 2010-02-25T19:52:40.523 に答える