[C#]HostToNetworkOrderとNetworkToHostOrderの違い

C#では、リトルエンディアンとビッグエンディアンの
バイト変換用メソッドとして、System.Net.IPAddressクラスに
HostToNetworkOrderNetworkToHostOrderを持っている。

コンピューターの配列順からネットワーク用の配列順(ビッグエンディアン)に
数値を変換するのが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つのメソッドは同じ結果を返すけど、
使用目的がわかるように使い分けろよというもののようだ。
 
今回は以上。