2

私の現在の設計には、組み込みシステムと PC 間の通信が含まれており、常に構造体の設計に悩まされています。

2 つのシステムには、対処する必要がある異なるエンディアンがあります。ただし、問題を解決するために、4 バイトごとに単純なバイト順の切り替えを行うことはできないことがわかりました。構造体に依存することがわかりました。

たとえば、次のような構造体です。

{
    uint16_t a;
    uint32_t b;
}

a と b の間にパディングが発生します。最終的には、パディング バイトが存在するため、エンディアン スイッチは a と b に固有のものでなければなりません。しかし、構造体の内容を変更するたびにエンディアン スイッチ ロジックを変更する必要があるため、見栄えが悪くなります。

パディングが入ったときに要素を構造体に配置するための良い戦略は何ですか? 構造体の末尾にパディング バイトのみが存在するように、要素を再配置する必要がありますか?

ありがとう。

4

1 に答える 1

0

異なるアーキテクチャには異なるアライメント要件があるため、プラットフォームに中立なシリアライゼーションをさらに行う必要があると思います。メモリのチャンクを取得して別のアーキテクチャに送信し、それをあるアドレスに配置してそこから読み取る(正しいデータ)などの安全で一般的な方法はないと思います。要素を 1 つずつ変換して送信するだけです。値をバッファにプッシュすると、パディングがなく、何がどこにあるかを正確に知ることができます。さらに、どの部分が変換を行うかを決定します (通常、PC にはそれを行うためのより多くのリソースがあります)。おまけとして、通信のチェックサム/署名を行って、エラー/改ざんを検出できます。

ところで、コンパイラは変数の順序をそのまま維持しますが、理論的には変数間に追加のパディングを配置できるため(パフォーマンス上の理由など)、アーキテクチャに関連するだけではありません。

于 2012-10-29T18:54:11.033 に答える