【发布时间】:2018-09-02 08:10:52
【问题描述】:
给定一个包含其中一种格式的 IPv6 地址的字符串,是否有一种 Java 标准方法可以对其进行规范化,以使同一地址的不同格式具有相同的规范化值?
即
normalise("2001:db8:0:0:1:0:0:1") = x
normalise("2001:db8::1:0:0:1") = x
normalise("2001:db8:0:0:1::1") = x
【问题讨论】:
给定一个包含其中一种格式的 IPv6 地址的字符串,是否有一种 Java 标准方法可以对其进行规范化,以使同一地址的不同格式具有相同的规范化值?
即
normalise("2001:db8:0:0:1:0:0:1") = x
normalise("2001:db8::1:0:0:1") = x
normalise("2001:db8:0:0:1::1") = x
【问题讨论】:
open-source IPAddress Java library 为不同的字符串格式提供了多种方法。有几个可用于生成规范化字符串。免责声明:我是 IPAddress 库的项目经理。
规范字符串和规范化字符串非常适合被视为“标准化”字符串。
规范字符串是编写由RFC 5952定义的IPv6地址的推荐方式
规范化字符串是类 java.net.InetAddress 生成的格式。
static void printNormalized(String strs[]) {
for (String str : strs) {
System.out.println(new IPAddressString(str).getAddress().toNormalizedString());
}
}
static void printCanonical(String strs[]) {
for (String str : strs) {
System.out.println(new IPAddressString(str).getAddress().toCanonicalString());
}
}
String strs[] = {
"2001:db8:0:0:1:0:0:1",
"2001:db8::1:0:0:1",
"2001:db8:0:0:1::1"};
printCanonical(strs);
System.out.println();
printNormalized(strs);
输出:
2001:db8::1:0:0:1
2001:db8::1:0:0:1
2001:db8::1:0:0:1
2001:db8:0:0:1:0:0:1
2001:db8:0:0:1:0:0:1
2001:db8:0:0:1:0:0:1
【讨论】:
您可以轻松实现这一点
通过使用InetAddress.getByName(String) 解析字符串
然后用getHostAddress()转回字符串:
public static String normalize(String s) throws UnknownHostException {
return InetAddress.getByName(s).getHostAddress();
}
此方法为您的所有 3 个示例返回 "2001:db8:0:0:1:0:0:1"。
顺便说一句:上面的代码可以规范化 IPv6 和 IPv4 地址。
【讨论】: