Java如何将IPV6地址转换为压缩形式?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接

原问题地址:stackoverflow.com/questions/7…

Q:

我已经使用 Inet6Address.getByName("2001:db8:0:0:0:0:2:1").toString()方法来压缩 IPv6 地址,并且输出是 2001:db8:0:0:0:0:2:1,但是我需要 2001:db8::2:1。,基本上,压缩输出应基于RFC 5952标准,即

  • 尽可能缩短:例如,2001:db8:0:0:0:0:2:1 必须缩短为 2001:db8 :: 2:1,同样,2001:db8 :: 0:1 是这是不可接受的,因为符号 ::可以用于产生较短的表示形式 2001:db8 :: 1
  • 处理一个16位0字段:不能只使用符号 :: 来缩短一个 16 位 0 字段。例如,表示形式 2001:db8:0:1:1:1:1:1 是正确的,但 2001:db8 :: 1:1:1:1:1 是不正确的。
  • 选择::的位置::: 的放置有其他选择时,必须缩短连续的 16 位 0 字段的最长运行时间(即,三个连续的零的序列字段在 2001 年缩短 :0:0:1:0:0:0:1)。当连续的 16 位 0 字段的长度相等时(即 2001:db8:0:0:1:0:0:1),必须缩短第一个零位序列。例如,2001:db8 :: 1:0:0:1 是正确的表示形式。

我还检查了 Stackoverflow 中的**另一篇文章**,但是没有指定条件(在 :: 位置的示例选择)。

是否有任何 Java 库可以处理此问题?谁能帮我吗?

提前致谢。

A:

这个方法怎么样?

String resultString = subjectString.replaceAll("((?::0\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2");
复制代码

输入:

2001:db8:0:0:0:0:2:1
2001:db8:0:1:1:1:1:1
2001:0:0:1:0:0:0:1
2001:db8:0:0:1:0:0:1
2001:db8:0:0:1:0:0:0
复制代码

输出:

2001:db8::2:1
2001:db8:0:1:1:1:1:1
2001:0:0:1::1
2001:db8::1:0:0:1
2001:db8:0:0:1::
复制代码

我希望最后一个例子是正确的,如果地址以 0 结尾是否还有其他规则?

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享