IPv6のドットフォーマットの文字列をコロンの形式に変換する最速の方法は? C#

次のIPのドット形式をバージョン6から変換する最速の方法は何ですか? コロンのフォーマットに?

128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255

私はちょうどランダムに上記のIPを入力しました。

ありがとう

3
テストされていない: IPAdress.Parse(YourIP).ToString()
追加された 著者 Tim Schmelter,
@TimSchmelter:IPAddress.Parseは、 "IPv6 dotted format"のような奇妙なカスタムフォーマットをサポートしていません。
追加された 著者 dtb,

3 答え

var result = new IPAddress(x.Split('.').Select(byte.Parse).ToArray()).ToString();
// result == "805b:2d9d:dc28:650a:a01:fc57:16c8:1fff"
6
追加された

最速の方法は、すべての解析と変換を自分で行うことです。

これは Select IPAddress を使用して、現在受け入れられている回答よりも10倍以上高速です。

string ip = "128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255";
StringBuilder b = new StringBuilder(8 * 4 + 7);
string hex = "0123456789abcdef";
int pos = 0;
for (int i = 0; i < 16; i++) {
  int n = 0;
  while (pos < ip.Length && ip[pos] != '.') {
    n = n * 10 + (ip[pos++] - '0');
  }
  pos++;
  b.Append(hex[n/16]);
  b.Append(hex[n % 16]);
  if (i % 2 == 1 && i < 15) {
    b.Append(':');
  }
}
return b.ToString();

注意:このコードでは先行ゼロは省略されず、常に4桁の8つの値を持つ文字列が生成されます。

編集:

これは、私が100万回実行することによって得られる操作当たりの時間です:

Fast: 0,00038 ms.
Linq: 0,00689 ms.
2
追加された
@ワジ:私は上記の時間を追加しました。
追加された 著者 Guffa,
@ssg:もちろん、より高速なコードを取得するには時間がかかります。私はあなたが "標準に準拠した"コードの意味を理解していません。このコードはどの規格に準拠していませんか?
追加された 著者 Guffa,
@ssg:「標準に準拠している」とは意味していますか?あなたは何の基準をしていますか?
追加された 著者 Guffa,
@ SSG:まだ、それについて考えて1年後? ;)
追加された 著者 Guffa,
@ssg - あなたが "自分で解析する"というコードがライブラリクラスIPAddressのように標準に準拠していないと不平を言うなら、この全体の質問を拒否する必要があります。 「IPv6 dotted notation」は標準に準拠していませんが、この質問とGuffaの答えの全体的なポイントです。
追加された 著者 Jesse Chisholm,
@ Guffa - 何かがインターネット上にあると、決して死ぬことはない。 :)私はちょうどこのスレッドについてはStackExchangeを思い出させて、私はしばらくそれにコメントしていない。 :) :) :)
追加された 著者 Jesse Chisholm,
広くテストされ、安定した標準準拠のコードではなく、新たに作成されたコードに潜在的なバグをデバッグする時間を追加することを忘れないでください。あなたが1秒間に何千倍の利益を得て、5時間のダウンタイムを得たら、何がポイントですか?
追加された 著者 Sedat Kapanoglu,
@ Guffa:コードに単体テストや仕様が含まれていないため、わかりません。しかし、私が知っているのは、 IPAddress クラスが標準に準拠しているということです。より特別なコードは、より多くのメンテナンスを意味します。私は最速のコードを得る努力を感謝します。私は、「最速の」コードを使用するのが時間切れになるとは限らないことを指摘しています。
追加された 著者 Sedat Kapanoglu,
@ Guffa私はドット表記法がRFCを持っていると思った。明らかにそうではありません。しかし、「最も速いのは常に最速の「コード」ではない」という私のコメントがあります。内部メカニックスを理解するために開発者が費やす時間は、オーバーヘッドを増やす可能性があります。
追加された 著者 Sedat Kapanoglu,
@JesseChisholm私は実際に質問された質問を主張していた。 OPは間違いなく「アドホックコードのデバッグに費やされた時間」の部分を見逃していました。それを指摘して何が間違っていますか?
追加された 著者 Sedat Kapanoglu,
@ Guffa Jesseが私の思い出を引き起こした:)
追加された 著者 Sedat Kapanoglu,
あなたは10倍速く、共有するベンチマークは何ですか?
追加された 著者 user349026,

IPv6の正式な「ドット付き」フォーマットはありません。表示される文字列は有効なIPv6アドレスではありません...公式フォーマットに固執し、RFC 4291に従ってください。可能であれば、RFC 5952の推奨事項に従ってください。他のフォーマットを使用すると、混乱や相互運用性の問題が発生します。

1
追加された