【问题标题】:addr is of illegal lengthaddr 的长度非法
【发布时间】:2020-07-14 13:41:24
【问题描述】:

我正在检查 ipAddress 是否在私有类别中。所以我在下面写了这个方法。我认为这是一个例外-

java.net.UnknownHostException: addr is of illegal length
    at java.net.InetAddress.getByAddress(InetAddress.java:948)
    at java.net.InetAddress.getByAddress(InetAddress.java:1324)

ipAddress (172.18.36.81) 是字符串

if(isPrivateIPAddress(ipAddress)) {

            return null;
        }


private static boolean isPrivateIPAddress(String ipAddress) {

    byte[] byteArray = null;
    InetAddress ia = null;
    try {
        byteArray = ipAddress.getBytes("UTF-16LE");
    } catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }


    try {
        ia = InetAddress.getByAddress(byteArray);
    } catch (UnknownHostException e) {

        e.printStackTrace();
    }

    return ia.isSiteLocalAddress();
}

【问题讨论】:

  • byteArray的值是多少?
  • ipAddress.getBytes("UTF-16LE");?
  • 在将byteArray 传递给getByAddress 之前,您是否尝试过输出它?
  • ip地址是多长?
  • 如果我尝试打印,我会得到 [B@3a303a3.

标签: java


【解决方案1】:

我认为您误解了如何将 IP 地址从 String 转换为 byte[]。正确的做法是将String解析为ints的序列,然后将其中的每一个转换为byte。但幸运的是,InetAddress 已经有一个方法可以为你处理,所以你可以写:

private static boolean isPrivateIPAddress(String ipAddress)
{
    return InetAddress.getByName(ipAddress).isSiteLocalAddress();
}

(连同您想要的任何有效性检查和错误处理)。

请注意,上述内容还将通过使用 DNS 查找来处理主机名。如果你不想这样,你需要预先检查 IP 地址,使用这样的东西:

if(! Pattern.matches("(\\d{1,3}\\.){3}\\d{1,3}", ipAddress)
    throw new IllegalArgumentException();

如果你没事的话。仅支持 IPv4。

【讨论】:

  • ,感谢您的信息。但我无法得到你的第二部分,处理主机名,你能解释一下吗?
  • @RaihanJamal:我是说InetAddress.getByName(String) 处理 IP 地址和主机名;对于主机名,它会在 DNS 中查找名称。从您的问题看来,您可能不想进行 DNS 查找,因此我建议在调用该方法之前检查以确认字符串是 IP 地址(而不是主机名)。
【解决方案2】:

提供给此方法的 Internet 地址必须是 4 或 16 字节长的字节数组。解码后在调试器中停止它,看看它有多长;例外是告诉你它不是这两者之一。然后弄清楚如何修复编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 2014-10-09
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多