AがBEシステムで、LEシステムBにデータを送信するために0x44332211を送信しているとします。デフォルトでは、Aは0x44332211のhtonlを使用します。これはわずか0x44332211です。
0x44332211がBに達すると、BはそれがBE形式であることを知っているので、Bはhtonl関数を使用してそれを反転して0x11223344に変更します。
この反転はどういう意味ですか?私はインターネットでこの概念について読んだ。なぜ保管する前に裏返すべきですか?
なぜなら、この場合、反転した値0x11223344が0x44332211のようにLEに格納されるからですが、似ているように見てもBが違うように解釈したのでAが送ったものとは違うのでしょうか?
/* BEからLEへの変換*/
答え1
ビッグエンディアンCライブラリの関数はhtonl()
実際には何もしません(「no-ops」)。ntohl()
これにより、同じコードがBEシステムとLEシステムで機能します。 C libでコンパイルすると、これらの関数はバイトを反転しますが、BEシステムではネットワークバイトシーケンスがビッグエンディアンであるため、変更されていません。ホストはすでにビッグエンディアンです。
つまり、あなたの例では、BEマシンAは何も変更しません。 LEマシンBのみ可能です。
答え2
実際、特定の方法で保管する前に反転する必要はありません。これは、ホストがリトルエンディアンシーケンスを使用するために必要です。したがって、ネットワークが1バイトより長い数値を受信すると、バイトを反転して数値を正しく解釈します。データをあらゆる目的に使用するには、まずこれらの反転が必要です。
例えとして、もともと日本語で印刷された漫画を読むことを想像してみてください(つまり、通常、最後のページは実際には最初のページです)。この事実を知らず、本を「裏返さない」と話を理解できません。