博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IPV4地址运算,计算当前IP地址是否在设定范围内
阅读量:3923 次
发布时间:2019-05-23

本文共 2542 字,大约阅读时间需要 8 分钟。

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"); }

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

转载地址:http://mqugn.baihongyu.com/

你可能感兴趣的文章
codeforces 397B. On Corruption and Numbers
查看>>
SqlMapConfig.xml中的setting属性设置
查看>>
hdu 3172 Virtual Friends(简单并查集)
查看>>
find the most comfortable road(并查集加贪心)
查看>>
Junk-Mail Filter(并查集,删除结点,虚父节点)
查看>>
A Bug's Life (并查集,同性恋问题,注意处理性别)
查看>>
选美大赛(线段树)
查看>>
超级玛丽(简单模拟超时)
查看>>
obex_io.c
查看>>
Linux程序开发基础概念
查看>>
Linux系统环境变量详谈
查看>>
sprintf函数用法
查看>>
make的常见错误信息
查看>>
gdb命令手册
查看>>
gdb中设置共享库断点问题
查看>>
GBD调试程序(转)作者:Janlex
查看>>
第16章可移植性
查看>>
java读取和修改ini配置文件实例代码
查看>>
setsockopt 设置socket 详细用法
查看>>
在局域网中实现多播功能
查看>>