我正在检查 ipAddress 是否在私有(private)类别中。所以我在下面写了这个方法。我把这个当作一个异常(exception)——

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

最佳答案

我认为您误解了如何将 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();
如果你没事仅支持 IPv4。

关于java - 地址长度非法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9729842/

10-10 18:28
查看更多