检查CIDR是否包含公共IP地址-在Java中

时间:2019-06-12 10:47:16

标签: java networking ip cidr

给出一个CIDR字符串,我想测试此CIDR是否包含未保留为私有地址的IP地址(即属于以下范围之一:)

192.168.0.0 - 192.168.255.255
172.16.0.0 - 172.31.255.255
10.0.0.0 - 10.255.255.255

2 个答案:

答案 0 :(得分:1)

Parse it into an InetAddress,然后选中its bytes

int slash = cidr.indexOf('/');
String ip = cidr.substring(0, slash);
InetAddress address = InetAddress.getByName(ip);
byte[] bytes = address.getAddress();
boolean privateAddress =
    (bytes[0] == 10) ||
    (bytes[0] == (byte) 172 && (bytes[1] >= 16 && bytes[1] < 32)) ||
    (bytes[0] == (byte) 192 && bytes[1] == (byte) 168);

或者,您可以直接检查字符串:

boolean privateAddress =
    cidr.startsWith("10.") || cidr.startsWith("192.168.") ||
    cidr.matches("172\\.(1[6-9]|2[0-9]|3[01])\\..*");

我个人会选择第一种方法。越短越好。我宁愿依靠一个解析器来处理IPv4地址表示法的所有特殊情况。

答案 1 :(得分:0)

最终为私有范围定义了静态CIDR块,并使用以下代码查看它是否与给定的CIDR重叠- https://gist.github.com/nacx/8837081716c5b333d7edc8bec4684482