- 根据开始ip与结束ip获取精确的ip段集,cidr表示
import java.util.ArrayList;
import java.util.List;
public class IpRangeToCidr {
private static long ipToLong(String ip) {
String[] ipParts = ip.split("\\.");
long result = 0;
for (int i = 0; i < 4; i++) {
result <<= 8;
result |= Integer.parseInt(ipParts[i]);
}
return result;
}
private static String longToIp(long ip) {
return String.format("%d.%d.%d.%d", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF);
}
public static List<String> ipRangeToCidr(String startIp, String endIp) {
long start = ipToLong(startIp);
long end = ipToLong(endIp);
List<String> result = new ArrayList<>();
while (start <= end) {
int maxMask = 32;
int zeroesCount = Long.numberOfTrailingZeros(start);
maxMask = Math.min(maxMask, 32 - zeroesCount);
while (start + (1L << (32 - maxMask)) - 1 > end) {
maxMask++;
}
result.add(longToIp(start) + "/" + maxMask);
start += (1L << (32 - maxMask));
}
return result;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
String startIp = "192.100.1.8";
String endIp = "192.168.1.16";
List<String> cidrList = ipRangeToCidr(startIp, endIp);
for (String cidr : cidrList) {
System.out.println(cidr);
}
System.out.println(System.currentTimeMillis() - start);
}
}