最快的方式转换IPv6点格式字符串冒号格式?c#

本文关键字:格式 字符串 方式 转换 IPv6 | 更新日期: 2023-09-27 18:12:52

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

128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255

我只是随机输入上面的IP。

谢谢

最快的方式转换IPv6点格式字符串冒号格式?c#

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

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

这比目前使用Split, SelectIPAddress的答案快十倍以上:

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.

IPv6没有官方的"点"格式。你显示的字符串不是一个有效的IPv6地址…请坚持使用官方格式,遵循RFC 4291,如果可能的话,遵循RFC 5952中的建议。使用其他格式会导致混淆和互操作性问题。