C#では、リトルエンディアンとビッグエンディアンの
バイト変換用メソッドとして、System.Net.IPAddressクラスに
HostToNetworkOrderとNetworkToHostOrderを持っている。
コンピューターの配列順からネットワーク用の配列順(ビッグエンディアン)に
数値を変換するのがHostToNetworkOrder、
ネットワーク用の配列順からコンピューター用の配列順に
値を変換するのがNetworkToHostOrder、ということになっている。
これらのメソッドが、実行環境のコンピューターがリトルエンディアンなら
変換を実行し、そうでない場合は何もしないようになっているものなのか、
あるいはコンピューターがリトルエンディアンの場合にだけ
これらのメソッドを呼び出せというものなのか、
MSDNの説明を読んだ限りではいまいちわからなかった。
ただいずれにせよ、Windows環境では常にリトルエンディアンになる
(BitConverter.IsLittleEndianは常にTrueを返す)ので、
実際にはこれらのメソッドを呼び出すと、常にバイト順の変換された値が返ってくる。
ところで、考えてみると、ホスト順→ネットワーク順であろうが、
ネットワーク順→ホスト順であろうが、バイトオーダーを逆にするという意味では、
処理内容は全く同じになるはずじゃないか。
そう思って、ILSpyを使って逆コンパイルしたソースを覗いてみた。
まずは、HostToNetworkOrder(short host)の中身。
public static short HostToNetworkOrder(short host) { return (short)((int)(host & 255) << 8 | (host >> 8 & 255)); }
続きまして、NetworkToHostOrder(short network)がこれ。
public static short NetworkToHostOrder(short network) { return IPAddress.HostToNetworkOrder(network); }
Oh...文句なしで一緒ですねこれは。
そんなわけで、この2つのメソッドは同じ結果を返すけど、
使用目的がわかるように使い分けろよというもののようだ。
今回は以上。