IPv6 noktalı biçim dizesini kolon biçimine dönüştürmenin en hızlı yolu? C #

Aşağıdaki IP'nin noktalı biçimini sürüm 6'dan dönüştürmenin en hızlı yolu nedir? kolon formatına

128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255

Sadece IP'yi rastgele yazdım.

Teşekkürler

3
Test edilmedi: IPAdress.Parse (YourIP) .ToString()
katma yazar Tim Schmelter, kaynak
@TimSchmelter: IPAddress.Parse, "IPv6 noktalı format" gibi garip özel formatları desteklemez.
katma yazar dtb, kaynak

3 cevap

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

En hızlı yol, tüm ayrıştırma ve dönüştürme işlemlerini kendiniz yapmaktır.

Bu, Split , Select ve IPAddress kullanarak şu anda kabul edilen cevaptan on kat daha hızlıdır:

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();

Not: Bu kod önde gelen sıfırları çıkarmaz, her zaman sekiz dört haneli değerlere sahip bir dize üretir.

Düzenle:

Bu, her bir milyon kez çalıştırdığım işlem başına süredir:

Fast: 0,00038 ms.
Linq: 0,00689 ms.
2
katma
@Wajih: Yukarıdaki zamanları ekledim.
katma yazar Guffa, kaynak
@ssg: Evet, doğal olarak daha hızlı kod almak daha uzun sürüyor. "Standartlara uygun" kodla ne demek istediğini anlamıyorum. Bu kod hangi standartlara uymaz?
katma yazar Guffa, kaynak
@ssg: "Standartlara uygun" ile ne demek istiyorsunuz? ? Hangi standarttan bahsediyorsun?
katma yazar Guffa, kaynak
@ ssg: Yine de, bir yıl düşündükten sonra? ;)
katma yazar Guffa, kaynak
@ssg - "Kendiniz ayrıştır" kodunun bir kitaplık sınıfı IPAdresi olarak standart olarak uygun olmadığını düşünüyorsanız, bu sorunun tamamını reddetmelisiniz. "IPv6 noktalı notasyon" standartlara uygun değildir, ancak bu sorunun ve Guffa'nın yanıtının tüm noktasıdır.
katma yazar Jesse Chisholm, kaynak
@Guffa - İnternette bir şey olduğunda, asla ölmez. :) Bu iş parçacığı hakkında StackExchange tarafından hatırlattım ve bir süre içinde yorumlamadım. :) :) :)
katma yazar Jesse Chisholm, kaynak
Yaygın olarak test edilmiş, kararlı, standartlara uygun bir kod yerine yeni oluşturulmuş bir kodda potansiyel hataların hatalarını ayıklamak için zaman eklemeyi unutmayın. Ne kazanırsan, bir saniye, bir saniye sonra 5 saat kesinti yaparsan, ne anlamı var?
katma yazar Sedat Kapanoglu, kaynak
@Guffa: Bilmiyorum çünkü kodunuz birim testleri veya teknik özellikleri içermiyor. Ama bildiğim, IPAddress sınıfının standartlara uygun olmasıdır. Daha fazla geçici kod daha fazla bakım anlamına gelir. Ancak en hızlı kodu alma çabasını takdir ediyorum. Sadece "en hızlı" kodunu kullanmanın her zaman bir zaman tasarrufu olamayacağını işaret ediyorum.
katma yazar Sedat Kapanoglu, kaynak
@Guffa Ben noktalı notasyon bunun için bir RFC olurdu düşündüm. Anlaşılan öyle değil. Ama benim "en hızlı her zaman en hızlı değil 'koduyla ilgili yorumlarım" duruyor. Buradaki iç mekaniği anlamak için harcayan zaman geliştiricileri, daha fazla yük yaratma potansiyeline sahiptir.
katma yazar Sedat Kapanoglu, kaynak
@JesseChisholm Aslında sorulan soruyla tartışıyordum. OP kesinlikle "geçici kod hata ayıklama için harcanan zaman" bölümünü kaçırdı. Bunu işaret etmenin nesi yanlış?
katma yazar Sedat Kapanoglu, kaynak
@Guffa Jesse anılarımı tetikledi :)
katma yazar Sedat Kapanoglu, kaynak
10 kat daha hızlı, paylaşmanız gereken herhangi bir ölçüt var mı?
katma yazar user349026, kaynak

IPv6 için resmi 'noktalı' bir biçim yoktur. Gösterdiğiniz dize geçerli bir IPv6 adresi değil. Lütfen resmi biçimlere sadık kalın ve RFC 4291'i ve mümkünse RFC 5952'deki önerileri takip edin. Diğer formatları kullanmak karışıklık ve birlikte çalışabilirlik sorunlarına neden olabilir.

1
katma