将 IPv6 点分格式字符串转换为冒号格式的最快方法? C#

发布于 2024-12-12 21:02:10 字数 136 浏览 0 评论 0原文

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

128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255

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

谢谢

What is the fastest way of converting the dotted format of the following IP from version 6
to colon format??

128.91.45.157.220.40.101.10.10.1.252.87.22.200.31.255

I just typed the IP above randomly.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

扛刀软妹 2024-12-19 21:02:10
var result = new IPAddress(x.Split('.').Select(byte.Parse).ToArray()).ToString();
// result == "805b:2d9d:dc28:650a:a01:fc57:16c8:1fff"
var result = new IPAddress(x.Split('.').Select(byte.Parse).ToArray()).ToString();
// result == "805b:2d9d:dc28:650a:a01:fc57:16c8:1fff"
压抑⊿情绪 2024-12-19 21:02:10

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

这比当前接受的使用 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.

The fastest way would be to do all parsing and conversion yourself.

This is more than ten times faster than the currently accepted answer using Split, Select and IPAddress:

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

Note: This code does not omit leading zeroes, it always produces a string with eight four-digit values.

Edit:

This is the times per operation that I get from running each a million times:

Fast: 0,00038 ms.
Linq: 0,00689 ms.
慢慢从新开始 2024-12-19 21:02:10

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

There is no official 'dotted' format for IPv6. The string you show is not a valid IPv6 address... Please stick to the official formats and follow RFC 4291 and if possible the recommendations in RFC 5952. Using other formats will cause confusion and interoperability problems.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文