如何在Java中标准化IPv6地址?

时间:2018-09-02 08:10:53

标签: java ip ipv6

给定一个字符串,其中包含一种格式的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

2 个答案:

答案 0 :(得分:3)

您可以轻松实现 通过使用InetAddress.getByName(String)解析字符串 然后使用getHostAddress()转换回字符串:

In [72]: df
Out[72]:
   reference   name      lon     lat
0          0  name1  34.0055  1.0041
1          1  name1      NaN     NaN
2          2  name1  39.5632  3.6854

In [73]: df['city'] = df.apply(lambda x: (None, None) if np.isnan(x.lon) or np.isnan(x.lat) else getplace(x.lon, x.lat), axis=1)

In [74]: df
Out[74]:
   reference   name      lon     lat             city
0          0  name1  34.0055  1.0041  (None, Algeria)
1          1  name1      NaN     NaN     (None, None)
2          2  name1  39.5632  3.6854    (None, Spain)

此方法将为您的所有3个示例返回public static String normalize(String s) throws UnknownHostException { return InetAddress.getByName(s).getHostAddress(); }

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

答案 1 :(得分:0)

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