Java 实现ip 转 cidr

自己工作需要,实现ip转cidr

看到网上有人实现,拿来自己用了

    import java.util.ArrayList;  
    import java.util.List;  
      
    public class RangeToCidr {  
        public static List<String> range2cidrlist( String startIp, String endIp ) {           
            long start = ipToLong(startIp);           
            long end = ipToLong(endIp);             
      
            ArrayList<String> pairs = new ArrayList<String>();           
            while ( end >= start ) {               
                byte maxsize = 32;               
                while ( maxsize > 0) {                   
                    long mask = CIDR2MASK[ maxsize -1 ];                   
                    long maskedBase = start & mask;                   
      
                    if ( maskedBase != start ) {                       
                        break;                   
                    }                   
      
                    maxsize--;               
                }                 
                double x = Math.log( end - start + 1) / Math.log( 2 );               
                byte maxdiff = (byte)( 32 - Math.floor( x ) );               
                if ( maxsize < maxdiff) {                   
                    maxsize = maxdiff;               
                }               
                String ip = longToIP(start);               
                pairs.add( ip + "/" + maxsize);               
                start += Math.pow( 2, (32 - maxsize) );           
            }           
            return pairs;       
        }         
      
        public static final int[] CIDR2MASK = new int[] { 0x00000000, 0x80000000,               
            0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,               
            0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,               
            0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,               
            0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,               
            0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,               
            0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,               
            0xFFFFFFFF };         
      
        private static long ipToLong(String strIP) {           
            long[] ip = new long[4];           
            String[] ipSec = strIP.split("\\.");           
            for (int k = 0; k < 4; k++) {               
                ip[k] = Long.valueOf(ipSec[k]);           
            }           
      
            return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];       
        }         
      
        private static String longToIP(long longIP) {           
            StringBuffer sb = new StringBuffer("");           
            sb.append(String.valueOf(longIP >>> 24));           
            sb.append(".");           
            sb.append(String.valueOf((longIP & 0x00FFFFFF) >>> 16));           
            sb.append(".");           
            sb.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));           
            sb.append(".");           
            sb.append(String.valueOf(longIP & 0x000000FF));     
      
            return sb.toString();       
        }   
    }  


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值