1. 程式人生 > 實用技巧 >判斷IP是否在某網段內

判斷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()); } }

文章有錯誤的歡迎大家指出,有其他想法的也歡迎留言討論