LE に保存する前にビッグ エンディアンのデータを反転するのはなぜですか?

LE に保存する前にビッグ エンディアンのデータを反転するのはなぜですか?

A が BE マシンで、LE である B に 0x44332211 のデータを送信しているとします。デフォルトでは、A は 0x44332211 の htonl を使用しますが、これは 0x44332211 に他なりません。

ここで、0x44332211 が B に到達すると、B はそれが BE 形式であることを認識するので、B は htonl 関数を使用して反転し、それを 0x11223344 に変更します。

この反転とはどういう意味ですか? この概念はインターネットで読みました。保管する前に反転する必要があるのはなぜですか?

その場合、反転された値 0x11223344 は 0x44332211 のように LE に保存されますが、これは A が送信したものとは異なります。B は、見た目は同じでも異なる解釈をするからです。

/* BE から LE への変換 */

答え1

ビッグ エンディアン C ライブラリのおよびhtonl()関数ntohl()は、実際には何も行いません (これらは「no-op」です)。この方法では、同じコードを BE マシンと LE マシンの両方で使用できます。LE マシンの C ライブラリでコンパイルされたこれらの関数はバイトを反転しますが、BE マシンでは、ネットワーク バイト順序がビッグ エンディアンであり、ホストがすでにビッグ エンディアンであるため、バイトはそのままになります。

つまり、あなたの例では、BE マシン A は何も変更しません。LE マシン B だけが変更します。

答え2

実際には、特定の方法で保存する前に反転する必要はありません。ホストはリトル エンディアン順序を使用するため、ネットワークから 1 バイトを超える数値を受信すると、その数値を正しく解釈するためにバイトを反転する必要があります。データがどのような目的で使用される場合でも、この反転を行う必要があります。

例として、日本の本来の印刷方法で印刷されたマンガ(通常は最後のページが実際には最初のページ)を読んでいるところを想像してください。この事実に気づかず、本を「めくる」ことをしなければ、ストーリーを理解することはできません。

関連情報