IPV4地址运算,计算当前IP地址是否在设定范围内

IPV4地址运算,计算当前IP地址是否在设定范围内

1.理解ip地址的含义

常用的ip地址是遵循IPv4协议,由32位的二进制数组成,在具体设置时看到的是4个0~255之间的数组成,常见就有本地环回地址“127.0.0.1”,还有常用的局域网地址“192.168.0.1”之类的。所以IPv4的地址能表示的范围就2的31次幂到2的0次幂之间。

2.如何把常见的10进制表示的ip地址转换成二进制

要理解10进制数在计算机内存中也是以0或1的方式去表示的,同时移位运算相比其他的四则运算对于计算机来说,运算效率更高。所以只需要定义一个范围大于或等于2的31次幂的整数类型,来进行位运算即可。在java中,int型只有4个字节,长度不够,所以选择使用long型,long型有8个字节,除去符号位足以保存2的31次幂的数。
代码如下

	/**
	 * 将4位的ip地址数组转二进制对应的十进制数.
	 * @param ipArr 4位的ip地址int数组.
	 * @return  ip地址数组转二进制对应的十进制数.
	 */
	private static long getIpByteToTen(int[] ipArr){
		//定义临时值
		long temp = 0;
		//迭代数组
		for(int i : ipArr ){
			//左移8位后,加上当前数值
			temp =(temp << 8) + i;
		}
		return  temp;
	}

int型的数组保存切割好的ip地址,然后迭代整个数组,首个数字进入循环,"<<"(符号位保持不动的左移位运算),左移8位后加上首个数字。继续迭代,再左移8位在加上当前第二个数字,依次迭代完整个数组。此时内存中保存的temp值就是真实ip地址的数值。

3.具体使用

代码如下

	/**
	 * IP地址运算判断是否在分配的地址范围内.
	 * @param enterIp 起始ip地址.
	 * @param endIp 结束ip地址.
	 * @param nowIp 当前ip地址.
	 * @return 运算结果 true :当前地址在范围内 false:当前地址不在范围内.
	 * @throws IpAddrFormatException ip地址转化异常。
	 */
	public  static boolean isSecurityIpAddr(String enterIp,String endIp,String nowIp) throws IpAddrFormatException {
		//传入的ip地址字符串,切成数组
		String [] enterIpArry = enterIp.split("\\.");
		String [] endIpArry = endIp.split("\\.");
		String [] nowIpArry = nowIp.split("\\.");
		//初始化接受转化数字的数组
		int [] enterIpNumArry = new int[4];
		int [] endIpNumArry = new int[4];
		int [] nowIpNumArry = new int[4];
		//判断数组格式是否正确
		if(enterIpArry.length==4&&endIpArry.length==4){
			try {
				//迭代起始ip地址数组,将String转成int
				for(int i=0 ; i < 4; i++){
					enterIpNumArry[i] = Integer.parseInt(enterIpArry[i]);
				}
				//迭代结束ip地址数组,将String转成int
				for(int i=0 ; i < 4; i++){
					endIpNumArry[i] = Integer.parseInt(endIpArry[i]);
				}
				//迭代当前ip地址数组,将String转成int
				for(int i=0 ; i < 4; i++){
					nowIpNumArry[i] = Integer.parseInt(nowIpArry[i]);
				}
			}catch (NumberFormatException ex){
				//捕获数值转化异常
				//抛出自定义异常
				throw  new IpAddrFormatException( ex.getCause());
			}
		}else {
			//抛出自定义异常
			throw new IpAddrFormatException("ipAddr format is not true");
		}
		//定义long型获取ip地址的二进制转十进制数
		long enterIpTenNum = getIpByteToTen(enterIpNumArry);
		long endIpTenNum = getIpByteToTen(endIpNumArry);
		long nowIpTenNum = getIpByteToTen(nowIpNumArry);
		//判断当前ip数值是否在范围内
		if(nowIpTenNum >= enterIpTenNum && nowIpTenNum <= endIpTenNum){
			return  true;
		}
		return false;
	}

现在已经把实现方法封装到工具方法中。
测试代码如下

	@Test
	public void contextLoads() throws IpAddrFormatException {
		boolean isSecurity = IPAddrUtil.isSecurityIpAddr("192.168.0.10","192.168.0.55","192.168.0.20");
	}

希望有有缘人可以看到,很简单,也很好用。

发布了3 篇原创文章 · 获赞 3 · 访问量 362

猜你喜欢

转载自blog.csdn.net/qq_42271561/article/details/103828266
今日推荐