以下の内容はhttps://oita.oika.me/2013/10/05/host_to_network_order/より取得しました。


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

今回は以上。




以上の内容はhttps://oita.oika.me/2013/10/05/host_to_network_order/より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14