7

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

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

エッセイ「聖戦と平和への嘆願について」は、リトルエンディアンにはさまざまな種類があることを暗示しているように思われますが、これは古いエッセイです。Java クラス ファイルの先頭にあるようなバイト オーダー マーカーはまだ必要ですか?

最後に、ネットワーク バイト オーダーに 4 バイト アラインメントが必要ですか。

4

5 に答える 5

6

bバイト配列に ASCII テキスト "BigE" があるとします。

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) 

そのためntohl、 とntohsの両方が必要です。

つまり、ntohs16 ビット short 内のバイトをスワップしntohl、その 32 ビット ワードの 4 バイトの順序を逆にします。

于 2009-01-20T22:44:58.367 に答える
0

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

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

于 2009-01-20T22:56:31.120 に答える
0

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

于 2009-01-20T22:45:58.287 に答える
0

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

于 2009-01-20T22:46:13.777 に答える
0

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

これには、非実践者や初心者が常に認識しているとは限らない、2 つの非常に重要な意味があります。

  1. (ASCII) 文字列には触れません。
  2. 一般的な「データ」をバイトスワップするブラインドアルゴリズムはありません。すべてのデータのタイプを把握し、各アイテムをそのタイプに必要な方法で交換する必要があります。
于 2009-01-20T23:08:24.760 に答える