如何规范化 Java 中的 IPv6 地址?

How to normalise IPv6 address in Java?

给定一个包含其中一种格式的 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();
}

此方法 returns "2001:db8:0:0:1:0:0:1" 适用于所有 3 个示例。

顺便说一句:上面的代码可以规范化 IPv6 IPv4 地址。

open-source IPAddress Java library为不同的字符串格式提供了多种方法。有几个可用于生成规范化字符串。免责声明:我是 IPAddress 库的项目经理。

两个非常适合考虑的 "standardized" 字符串是规范字符串和规范化字符串。

规范字符串是 RFC 5952

定义的 IPv6 地址的推荐书写方式

标准化字符串是由 class 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