【问题标题】:How to normalise IPv6 address in Java?如何在 Java 中规范化 IPv6 地址?
【发布时间】: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

【问题讨论】:

    标签: java ip ipv6


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      您可以轻松实现这一点 通过使用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 地址。

      【讨论】:

      • 不幸的是,如果字符串不是 IP 地址,这会触发 DNS 查找。
      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2011-06-17
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多