判断IP是否在某网段内
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()); } }
文章有错误的欢迎大家指出,有其他想法的也欢迎留言讨论
浙公网安备 33010602011771号