addr是非法的长度

时间:2012-03-15 23:40:06

标签: java

我正在检查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)是String

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();
}

2 个答案:

答案 0 :(得分:8)

我认为您误解了如何将IP地址从String转换为byte[]。正确的方法是将String解析为int的序列,然后将其中的每一个转换为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();
如果你是O.K.只支持IPv4。

答案 1 :(得分:1)

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