【问题标题】:Fastest way of converting IPv6 dotted format string to colon format ? C#将 IPv6 点格式字符串转换为冒号格式的最快方法? C#
【发布时间】:2011-10-28 11:07:49
【问题描述】:

从版本6转换以下IP的点分格式最快的方法是什么 转冒号格式??

128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255

我只是随便打了上面的IP。

谢谢

【问题讨论】:

  • 未测试:IPAdress.Parse(YourIP).ToString()
  • @TimSchmelter:IPAddress.Parse 不支持奇怪的自定义格式,例如“IPv6 点分格式”。

标签: c# ipv6 ipv4


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

【讨论】:

    【解决方案2】:

    最快的方法是自己进行所有的解析和转换。

    这比当前使用SplitSelectIPAddress 接受的答案快十倍以上:

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

    注意:此代码不会省略前导零,它始终会生成一个包含八个四位数值的字符串。

    编辑:

    这是我每运行一百万次所获得的每次操作的次数:

    Fast: 0,00038 ms.
    Linq: 0,00689 ms.
    

    【讨论】:

    • 请不要忘记花时间调试新创建的代码中的潜在错误,而不是经过广泛测试、稳定、符合标准的代码。如果您获得数千秒的时间并获得 5 小时的停机时间作为回报,那还有什么意义?
    • @Wajih:我在上面添加了时间。
    • @ssg:是的,自然需要更长的时间才能获得更快的代码。我不明白你所说的“符合标准”的代码是什么意思?这段代码不符合什么标准?
    • @Guffa:我不知道,因为您的代码不包含单元测试或规范。但我知道IPAddress 类是符合标准的。更多的临时代码意味着更多的维护。不过,我很欣赏为获得最快代码所做的努力。我只是指出,使用“最快”的代码可能并不总是节省时间。
    • @ssg:“符合标准”是什么意思?你指的是什么标准?
    【解决方案3】:

    IPv6 没有官方的“点”格式。您显示的字符串不是有效的 IPv6 地址...请遵循官方格式并遵循 RFC 4291 并尽可能遵循 RFC 5952 中的建议。使用其他格式会导致混淆和互操作性问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2021-11-09
      • 1970-01-01
      • 2020-11-20
      相关资源
      最近更新 更多