我正在检查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();
}
答案 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字节长的字节数组。在解码后在调试器中停止它并查看它有多长;例外是告诉你它不是这两个中的一个。然后弄清楚如何修复编码。