web-dev-qa-db-ja.com

ntohs()とntohl()は同等ですか?

C#にネットからホストへの変換機能はありますか?グーグルしてあまり見つけられない。 :P

32
bobber205

IPAddress.HostToNetworkOrder および IPAddress.NetworkToHostOrder

各メソッドには、16、32、および64ビット整数のオーバーロードがあります。

40
Jon Skeet

@ jon-skeetの答え あなたの質問によると最も正確です。ただし、「ntoh_」および「hton_」C関数は、 リトルエンディアンとビッグエンディアンのコンピュータアーキテクチャ の間を変換するために広く使用されています。

エンディアン変換を実行することがである場合BitConverterクラス (静的クラスより適切な方法をもたらすコアアセンブリ)。特に次の場合:

  • バイトの配列の操作(ファイルまたはネットワークストリームで広く使用されています)。
  • エンディアンの検出 ランタイムマシンのアーキテクチャ。
  • 型キャストせずに整数(ブール値、小数)を超える基本構造を変換します。
  • コードはネットワーク操作(System.Net名前空間)とは関係ありません。
1
caligari

System.Memory nugetパッケージには、_System.Buffers.Binary.BinaryPrimitives_静的クラスが含まれています。これには、ReverseEndiannessの多くのオーバーロードを含む「エンディアン」を処理するための静的メソッドが含まれています。 dotnetコアでは、HostToNetWorkOrderはこれらのReverseEndiannessメソッドを使用して実装されます。リトルエンディアンアーキテクチャ(.NETをサポートしているのはこれだけだと思います)では、HostToNetworkOrderメソッドとReverseEndiannessメソッドのパフォーマンスはdotnetcoreで同じです。

ただし、dotnetフレームワーク(net461)では、HostToNetworkOrderの呼び出しのパフォーマンスは、ReverseEndiannessの呼び出しよりもわずかに(2倍ではありません)遅くなります。

JITコンパイラは、実際には、BSWAPx86命令を呼び出すためにこれらのメソッドを特別にケーシングしていると思います。独自のコードベースでReverseEndianness(long)メソッドの実装を正確に複製すると、_System.Memory_実装を呼び出すよりも約4倍遅くなります。 JITマジックが起こっていることを示唆しています。

0
MarkPflug