0

次のネットワークの類推については、少し混乱しています。

Winsock の send() 関数にポインターを渡すことで、(整数を使用して) 構造体をシリアル化しているとします。

Intel マシン上のこれらの 4 バイト整数は、ビッグ エンディアン マシンでは異なる方法で表現され、反対側で構造が再作成されるときに誤って解釈される可能性があります。

それは理解できますが、問題があります - 疑問に思っていたのですが、両方のマシンで実行される両方のプログラムが 32 ビットとしてコンパイルされている場合はどうなるでしょうか? バイナリ ファイルの場合と同じように、インテル <-> AMD 命令セットからの自動変換は行われませんか?

それを回避する方法がない場合、この問題を起こさずに生データ構造をネットワーク経由で送信するにはどうすればよいですか?

4

3 に答える 3

0

異なるアーキテクチャのマシン (いいえ、Intel と AMD は [十分に] 異なるアーキテクチャを持っていません) は異なるバイト順でデータを格納する可能性があるためです。ネットワークを使用する人々は、1990 年の Digital Equipment VAX、2005 年の Sun Sparc、1996 年の AMD 486、2008 年の iPhone (ARM)、2013 年の Intel CoreX マシンなど、理解できる形式でデータを受信することを望んでいるため、ネットワークプロトコルは、順序が特定の方法である必要があることを規定しています。

1980 年から 1990 年代にかけて、最も一般的なマシン (少なくともある種のネットワークに接続される可能性が高いマシン) はたまたま「ビッグ エンディアン」でした。時代が変わったという理由だけで、今それを変更することはできません。なぜなら、それが何であるかという順序に依存しているすべての既存のコードを引き裂く必要があるからです。

もちろん、自分のソフトウェアのみを使用して他のマシンにデータを送信するだけであれば、好きなことを行うことができます-それは自分のデータであり、データをパッキングする方法であり、ソフトウェアです。どちらの順序を使用するかについて、両端が同じ考えを持っている限り。自分のものではないプロトコルにデータを送信したい場合は、バイトオーダーに関してそのプロトコルの状態に従う必要があります。

そして、それは本当に「習慣」の問題です。標準がなければ、基本アーキテクチャが異なるマシン間でデータを送信できません。メーカー (またはモデル) が「そのときの感覚」に応じてブレーキ ペダルの位置を変えると、ほとんどの人が車を運転する能力が損なわれるのと同じように、足を踏み入れるかどうかを覚えておく必要があることを想像してみてください。左、中央、または右のペダルで遅くなりますか?

于 2013-05-09T13:12:58.987 に答える