给定一个包含其中一种格式的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
您可以通过使用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地址。
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