addr是非法的长度

我正在检查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(); } 

我认为你误解了如何将IP地址从String转换为byte[] 。 正确的方法是将String解析为一系列int ,然后将每个int为一个byte 。 但幸运的是, InetAddress已经有了一种方法来处理这个问题,所以你可以写:

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

(以及您想要的任何有效性检查和error handling)。

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

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

如果你只支持IPv4就行了。

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