Java 从起始ip和广播ip确定子网/cidr

Java 从起始ip和广播ip确定子网/cidr,java,networking,ipv4,Java,Networking,Ipv4,我在ApacheCommonsNetutils和其他已知的API中进行了搜索,但找不到一个好方法。 给定一个开始ip和广播如何查找子网或cidr 我知道broadcast=ip|(~子网) 但是给定起始ip和广播ip,如何查找子网 例如,启动ip=10.2.22.1和getway/broadcast ip=10.2.22.255 CIDR格式为10.2.22.0/24或netmask格式为255.255.255.0,希望对您有所帮助: int ip2Num(final String ip) {

我在ApacheCommonsNetutils和其他已知的API中进行了搜索,但找不到一个好方法。 给定一个开始
ip
广播
如何查找
子网
cidr

我知道
broadcast=ip|(~子网)

但是给定起始ip和广播ip,如何查找子网

例如,启动ip=10.2.22.1和getway/broadcast ip=10.2.22.255

CIDR
格式为
10.2.22.0/24
netmask
格式为
255.255.255.0
,希望对您有所帮助:

int ip2Num(final String ip) {
    int result = 0;
    final String[] segs = ip.split("\\.");
    int c = 32;
    for (final String s : segs) {
        result |= Integer.parseInt(s) << c;
        c -= 8;
    }
    return result;
}
// not used at that moment
String long2Ip(final int l) {
    String result = "" + l;
    result = result.replaceAll("(?<=\\d{3})(\\d{3})", ".$1");
    return result;
}
void sendIfMatch(final String ip, final String netmask) {
    final int lIp = ip2Num(ip);
    final int lNm = ip2Num(netmask);
    final boolean matches = ((lIp & lNm) == lIp);
    if (matches) {
        System.out.println("we should do something for ip " + ip);
    } else {
        System.out.println("dont match: " + lIp + "::" + lNm);
    }
}
void test() {
    sendIfMatch("10.2.22.1", "10.2.22.255");
}
int ip2Num(最终字符串ip){
int结果=0;
最后一个字符串[]segs=ip.split(“\\”);
int c=32;
用于(最终字符串s:segs){

result |=Integer.parseInt(s)找到了如何执行此操作

Integer cidrSize = Integer.numberOfLeadingZeros(startIpInteger ^ broadcastIpInteger);
String cidrNotation = startIpString/cidrSize;
如何获得IP的整数表示? 可以帮助

现在,获取网络掩码可以非常简单

SubnetInfo info = new SubnetUtils(cidrNotation).getInfo();
String netmask = info.getNetmask();

你的标题文本与你的问题文本不匹配。你实际拥有哪些项目,你在寻找哪些项目?来吧!将IP和子网设置为一个合理的数字,“|”应该可以工作。不要忘记在之后将IP设置为字符串…-只需插入一些点即可。