多くの構造を持つ構造を別のコントローラーに送信したいとします(コントローラーと同じものではなく、別のアーキテクチャーを持つもの)。 私は、利用可能な発明されたシリアライズ方法を使用せずに、データを送信するための並べ替えを開発する必要がありました。 パディングされたバイトがどこに追加されて他のコントローラに送信する前にそれらを削除できるのかを知るにはどうすればよいですか? 他のコントローラがデータの送信バイトから構造のすべてのメンバーを再構築できるように、どのようにメタデータを実装できますか? その他の要点も歓迎します。コントローラー間で構造を送信する
答えて
TLVタイプのコード体系を使用することを検討してください。通常、TLVはType Length Valueと呼ばれます。
通常要素が
#pragma pack(1)
typedef struct _tlv_node {
uint8_t type;
uint16_t length;
uint8_t value[0];
}tlv_node;
のように見えるこれは、符号化と復号化の流れの多くのためにかなり標準であり、あなたは、構造体のいずれかのタイプにそれを拡張することができます。多くのオープンソースコードではこれが実装されているため、サンプル実装の欠如はありません。
完全に移植可能なシリアル化/逆シリアル化は非常に手動です。あなたは構造体のメンバーを通過してコピーします。とにかくstructメンバーごとにいくつかの "手作業コーディング"を行う必要があることを意味するので、それはほとんど埋め合わせを意味しないので、offsetof
を使用してパディングを見つけることができます。
#pragma pack(1)
などが理想的ではありません。ストラクチャは理由でパックされており、パディングを無効にする移植性のある手段はありません。 8ビットや16ビットのような小さなCPUでは実現可能ですが、移植性の高いコードでは実現できません。
重要なのは、データがどのように格納されるかを示す、明確に定義されたネットワークプロトコルを持つことです。には、エンディアンがです。つまり、送信者、プロトコル、受信者はすべてエンディアンを持ち、必ずしも同じであるとは限りません。
(伝統的に、データ・プロトコルでは、XORゲートによるハードウェアCRCチェックを実装するのが唯一の理由でビッグ・エンディアンが使用されることがよくありますが、現在はほとんど問題ではありません。 。)
要件に応じて、「明確に定義されたネットワークプロトコル」はASCIIベースでも可能です。このような転送は、バイナリプロトコルよりも安全で実装が容易で、監視/デバッグが容易です。 – tofro
@tofro ASCIIプロトコルとは、データが膨らみ、エンコード/デコードが遅いということです。あなたがそれらを使用する唯一の理由は、監視が非プログラマによって行われるべき場合です。私は "ATコマンド"のような古いやり方の実装を避けるだろう。 – Lundin
インターネットと呼ばれるもののほとんどではないにしても、そのような「古いもの」に基づいています。それほど悪くはありませんか? – tofro
- 1. コントローラーのケース構造をリファクタリングする
- 2. コントローラー、サブコントローラー、ビューの構造
- 3. 構造体をデータベースに送信
- 4. @ Html.EditorForはコントローラーに間違った値を送信します
- 5. C++、tcp経由で構造体を送信する
- 6. ajaxでlaravelのコントローラーにデータを送信
- 7. のmemcpy()修正クライアントソケットファイルディスクリプタクライアントとの間でserver.I構造を送信しようと
- 8. C#の構造体へのポインタをC++ DLLに送信する
- 9. プレイヤーエイリアス(Game Center)をARCで構造体経由で送信
- 10. Cでソケットを介して構造体を送信
- 11. symfonyの別のコントローラーにフォームを送信
- 12. yii2のコントローラーから別のコントローラーにデータを送信する方法
- 13. NumPyを使用してMPI4Pyで構造化配列データを送受信する
- 14. QtでTCP IPを使用して構造体を送信するには
- 15. WANを介して効率的なグラフデータ構造を送信
- 16. ソケットを介して構造体を送信
- 17. プレイフレームワークのコントローラーに送信する前にトリミングパラメーターを設定する
- 18. Laravel - コントローラーでajaxフォームの送信後にリダイレクトする方法
- 19. Facebook Messenger API:構造化メッセージ(Java)を送信
- 20. パーマリンク構造が子サイトを親サイトドメインに強制的に送信
- 21. recvfrom()とsendto()を使用した送信構造
- 22. コントローラーから電子メールを送信すると遅れます
- 23. Ajaxを使用してコントローラーにデータを送信する
- 24. 構造体は実際にGolangチャネルで送信された場合、ゴルーチン間でコピーされますか?
- 25. AngularJSのコントローラー機能から表示するデータを送信
- 26. C++でパックされた構造体を送信してC#で受信する方法
- 27. クラススレッド間でメッセージを送信する
- 28. コンピュータ間でメッセージを送信する
- 29. アクター間でAkka HttpEntityを送信する
- 30. インテントを間隔で送信する
コードはb0rkenで無効です。値の1つの要素を特に上回るものは未定義の振る舞いを持ち、 'pack'は非常に高価なハックです。 –
1999年にようこそ、私たちはもう安全でない "struct hack"を使用する必要はありません。 – Lundin
@ lundinあなたはここで自分自身のことを話していますが、プラグマパックは一般的なプロセッサの一般的なツールチェーンでサポートされているハックではなく、それが指し示すメモリが特定のレイアウトを持っていることを確認する1つの理由があります。またはネットワークパケット。梱包時の嘲笑は、プロセッサの束が依然としてsigbusである場合にはかなり90です。インターネット上で論争することは決して古くなることはありません。私はあなたの答えが好きです。 – amritanshu