データをネットワーク順序に変換するために、リトルエンディアンシステムで使用される変換は何ですか?

StackOverflow https://stackoverflow.com/questions/463416

質問

リトルエンディアンシステムのデータをネットワークバイト順に変換するために必要な基本的な変換は何ですか? 2バイトと4バイトのデータの場合、変更をカプセル化するための既知の関数(htons、ntohlなど)があります。1バイトのデータの文字列(もしあれば)はどうなりますか?

また、ウィキペディアは、リトルエンディアンがビッグエンディアンの鏡像であることを暗示していますが、それが本当なら、2バイトと4バイトのデータに特定の処理が必要なのはなぜですか?

エッセイ<!> quot;聖戦と平和への嘆願について<!> quot;リトルエンディアンには多くの異なるフレーバーがあることを暗示しているようです-それは古いエッセイです-それはまだ当てはまりますか? Javaクラスファイルの先頭にあるようなバイトオーダーマーカーはまだ必要ですか?

最後に、ネットワークバイトの順序に4バイトのアライメントが必要ですか?

役に立ちましたか?

解決

ASCIIテキスト<!> quot; BigE <!> quot;があるとします。バイトの配列b内。

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

これは、文字列のネットワーク順序でもあります。

32ビット整数として扱われた場合、

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

リトルエンディアンプラットフォームおよび

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

ビッグエンディアンプラットフォーム。

各16ビット作品を個別に変換すると、これらのどちらも取得できません

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

これは、ntohlntohsの両方が必要な理由です。

つまり、<=>は16ビットのshort内のバイトをスワップし、<=>は32ビットワードの4バイトの順序を逆にします。

他のヒント

2バイトおよび4バイトデータの特定の処理関数は、特定のデータサイズで動作するプロセッサ命令があるという事実を利用します。 1バイトの反転関数を4回実行すると、一度にすべての4バイトで同じ(スケールは大きくなりますが)操作を実行するために幅の広い命令を使用するよりも確かに効率が低下します。

1バイトのデータは、エンディアン間の変換を必要としません(文字列のエンコードにはUTF-16およびUTF-32よりもUTF-8の利点があります)。

  

ネットワークバイトオーダーには4バイトのアライメントが必要ですか?

ネットワークを経由するバイトに特定のアライメントは必要ありません。プロセッサはメモリ内で特定のアライメントを要求する場合がありますが、矛盾を解決するのはユーザー次第です。 x86ファミリは通常、そのような要求を行いません。

基本的な考え方は、すべてのマルチバイト型ではバイトの順序を逆にする必要があるということです。 4バイト整数では、バイト0と3がスワップされ、バイト1と2がスワップされます。 2バイトの整数では、バイト0と1がスワップされます。 1バイト文字はスワップされません。

これには2つの非常に重要な意味があり、実践者でも初心者でも常に気付かないことがあります:

  1. (ASCII)文字列は変更されません。
  2. 一般的な<!> quot; data <!> quot;をバイトスワップするブラインドアルゴリズムは no 可能です。すべてのデータのタイプを知り、そのタイプに必要な方法で各アイテムを交換する必要があります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top