IP、网段、子网掩码这些基本概念就不说了,子网掩码的作用就是将一个IP地址分为网络地址和主机地址,判断ip是否属于改网段,就看ip网络地址是否与网段相同,代码实现可以利用Java的按位&特性。
以下是Java实现,IpContant.java包含了三个isContant方法,isContant1是我写的,适合处理子网掩码是xxx.xxx.xxx.xxx的情况。isContant2、isContant3是借鉴了他人改编的,适合网段表示为xxx.xxx.xxx.xxx/xx或者直接输入掩码位数的情况。
public class IpContant {
/**
* 判断该网段下是否包含该ip,子网掩码类型为255.255.255.255
* @param ip
* @param net 网段
* @param mask 子网掩码
* @return
*/
public static boolean isContant1(String ip, String net, String mask) {
if (isBlank(ip) || isBlank(net) || isBlank(mask)){
return false;
}
int[] ips = Arrays.stream(ip.split("\\.")).mapToInt(value -> Integer.parseInt(value)).toArray();
int[] nets = Arrays.stream(net.split("\\.")).mapToInt(value -> Integer.parseInt(value)).toArray();
int[] masks = Arrays.stream(mask.split("\\.")).mapToInt(value -> Integer.parseInt(value)).toArray();
for (int i = 0; i < ips.length; i++) {
if ((ips[i] & masks[i]) != (nets[i] & masks[i])) {
return false;
}
}
return true;
}
/**
* 判断该网段下是否包含该IP,子网类型为掩码位数
* @param ip
* @param net
* @param mask
* @return
*/
public static boolean isContant2(String ip, String net, int mask) {
if (isBlank(ip) || isBlank(net)){
return false;
}
int[] ips = Arrays.stream(ip.split("\\.")).mapToInt(value -> Integer.parseInt(value)).toArray();
int[] nets = Arrays.stream(net.split("\\.")).mapToInt(value -> Integer.parseInt(value)).toArray();
int ipAddr = ips[0] << 24 | ips[0] << 16 | ips[0] << 8 | ips[0];
int netAddr = ips[0] << 24 | ips[0] << 16 | ips[0] << 8 | ips[0];
for (int i = 0; i < 4; i++) {
//获取各段IP掩码位数,并换算具体数值
int maskDigits = mask - 8 > 0 ? 8 : mask > 0 ? mask : 0;
int maskItem = 2 << (8 - maskDigits);
if ((ips[i] & maskItem) != (nets[i] & maskItem)) {
return false;
}
mask -= 8;
}
return true;
}
/**
* 判断该网段下是否包含该IP,子网位数包含在网段中
* @param ip
* @param netAndMask
* @return
*/
public static boolean isContant3(String ip, String netAndMask) {
String[] result = netAndMask.split("/");
int mask = Integer.valueOf(result[1]);
return isContant2(ip, result[0], mask);
}
/**
* 判断输入字符串是否为空
* @param str
* @return
*/
public static boolean isBlank(String str){
return str == null || "".equals(str.trim());
}
}
文章有错误的欢迎大家指出,有其他想法的也欢迎留言讨论