OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

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つのメソッドは同じ結果を返すけど、
使用目的がわかるように使い分けろよというもののようだ。

今回は以上。