我正在检查 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/