当前位置 博文首页 > 文章内容

    使用java将ip地址与数字进行相互转换

    作者: 栏目:未分类 时间:2020-06-29 9:57:48

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    一、将ip地址转成long数值

    将IP地址转化成整数的方法如下:

    1、通过String的split方法按.分隔得到4个长度的数组

    2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1

    二、将数值转换为ip地址

    将十进制整数形式转换成127.0.0.1形式的ip地址

    将整数形式的IP地址转化成字符串的方法如下:

    1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。

    2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。

    3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。

    4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。

    三、代码具体的实现

    public class IPUtil {
        /**
         * ip地址转成long型数字
         * 将IP地址转化成整数的方法如下:
         * 1、通过String的split方法按.分隔得到4个长度的数组
         * 2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1
         * @param strIp
         * @return
         */
        public static long ipToLong(String strIp) {
            String[]ip = strIp.split("\\.");
            return (Long.parseLong(ip[0]) << 24) + (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8) + Long.parseLong(ip[3]);
        }
    
        /**
         * 将十进制整数形式转换成127.0.0.1形式的ip地址
         * 将整数形式的IP地址转化成字符串的方法如下:
         * 1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。
         * 2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。
         * 3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。
         * 4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。
         * @param longIp
         * @return
         */
        public static String longToIP(long longIp) {
            StringBuffer sb = new StringBuffer("");
            // 直接右移24位
            sb.append(String.valueOf((longIp >>> 24)));
            sb.append(".");
            // 将高8位置0,然后右移16位
            sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));
            sb.append(".");
            // 将高16位置0,然后右移8位
            sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));
            sb.append(".");
            // 将高24位置0
            sb.append(String.valueOf((longIp & 0x000000FF)));
            return sb.toString();
        }
    
        public static void main(String[] args) {
            System.out.println(ipToLong("219.239.110.138"));
            System.out.println(longToIP(18537472));
        }
    }
    
    或者:
    package hiveTest;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    
    public class IpConcat extends UDF{
    
    	public Boolean evaluate(String ip, String cidr){
            return isInRange(ip, cidr);
    		
        }
    	
    	public static boolean isInRange(String ip, String cidr) {    
    	    String[] ips = ip.split("\\.");    
    	    int ipAddr = (Integer.parseInt(ips[0]) << 24)    
    	            | (Integer.parseInt(ips[1]) << 16)    
    	            | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);    
    	    int type = Integer.parseInt(cidr.replaceAll(".*/", ""));    
    	    int mask = 0xFFFFFFFF << (32 - type);    
    	    String cidrIp = cidr.replaceAll("/.*", "");    
    	    String[] cidrIps = cidrIp.split("\\.");    
    	    int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)    
    	            | (Integer.parseInt(cidrIps[1]) << 16)    
    	            | (Integer.parseInt(cidrIps[2]) << 8)    
    	            | Integer.parseInt(cidrIps[3]);    
    
    	    return (ipAddr & mask) == (cidrIpAddr & mask);
    	}
    }
    

    四、将ip网段转换为对应的数字范围,暂时不支持ipv6

    public class AddressConvert extends UDF {   #继承UDF,编写hive的自定义函数
    	public Boolean evaluate(String ip, String cidr){   #需要实现的方法
            return isInRange(ip, cidr);
    		
        }
    
    	private Boolean isInRange(String ip, String cidr) {
    		String[] split = cidr.split("\\/");
    		String[] ips = split[0].split("\\.");
    		long minValue = 0L;
    		long maxValue = 0L;
    		if (split.length == 1) {
    			long intIp =  Long.parseLong(ips[0]) << 24 
    					| Long.parseLong(ips[1]) << 16 
    					| Long.parseLong(ips[2]) << 8 
    					| Long.parseLong(ips[3]);
    		}
    		else if (split.length == 2) {
    			int flag = Integer.parseInt(split[1]) >> 3;
    			
    			switch (flag) {
    			case 1:
    				 minValue = Long.parseLong(ips[0]) << 24 
    						| Long.parseLong(ips[1]) << 16 
    						| Long.parseLong(ips[2]) << 8 
    						| Long.parseLong("1");
    				 maxValue = Long.parseLong(ips[0]) << 24 
    						| Long.parseLong(ips[1]) << 16 
    						| Long.parseLong(ips[2]) << 8 
    						| Long.parseLong("254");
    				break;
    			case 2:
    				 minValue = Long.parseLong(ips[0]) << 24 
    				| Long.parseLong(ips[1]) << 16 
    				| Long.parseLong("0") << 8 
    				| Long.parseLong("1");
    				 maxValue = Long.parseLong(ips[0]) << 24 
    				| Long.parseLong(ips[1]) << 16 
    				| Long.parseLong("255") << 8 
    				| Long.parseLong("254");
    		break;
    			case 3:
    				minValue = Long.parseLong(ips[0]) << 24 
    				| Long.parseLong("0") << 16 
    				| Long.parseLong("0") << 8 
    				| Long.parseLong("1");
    				 maxValue = Long.parseLong(ips[0]) << 24 
    				| Long.parseLong("255") << 16 
    				| Long.parseLong("255") << 8 
    				| Long.parseLong("254");
    				 break;
    			}
    		
    		}
    		
    		// 源ip转换
    		Long intSip = Long.parseLong(ip);
    		
    //		String[] sip = ip.split("\\.");
    //		Long intSip = Long.parseLong(sip[0]) << 24 
    //				| Long.parseLong(sip[1]) << 16 
    //				| Long.parseLong(sip[2]) << 8 
    //				| Long.parseLong(sip[3]);
    		
    		
    		if (minValue <= intSip && intSip <= maxValue) {
    			return true;
    		}else {
    			return false;
    		}
    		
    	}
    	
    	
    }
    

    部分代码借鉴:
    https://www.cnblogs.com/feiyumo/p/7521157.html