Java IP地址字符串与BigInteger的转换,支持IPv6

  1. import java.math.BigInteger;   
  2. import java.net.InetAddress;   
  3. import java.net.UnknownHostException;   
  4.   
  5. public final class IpLimit {   
  6.     //存放IP范围的内引类   
  7.     class IpRange{   
  8.         private String[][] ipRange;   
  9.         public IpRange(String[][] ip ){   
  10.             this.ipRange = ip;             
  11.         }   
  12.         public String getIpAt(int row,int column){    
  13.             return ipRange[row][column];    
  14.         }   
  15.            
  16.     }   
  17.     /**  
  18.      * 防止被实例化  
  19.      */  
  20.     private IpLimit() {   
  21.     }   
  22.   
  23.     /**  
  24.      * 将字符串形式的ip地址转换为BigInteger  
  25.      *   
  26.      * @param ipInString  
  27.      *            字符串形式的ip地址  
  28.      * @return 整数形式的ip地址  
  29.      */  
  30.     public static BigInteger StringToBigInt(String ipInString) {   
  31.         ipInString = ipInString.replace(" """);   
  32.         byte[] bytes;   
  33.         if (ipInString.contains(":"))   
  34.             bytes = ipv6ToBytes(ipInString);   
  35.         else  
  36.             bytes = ipv4ToBytes(ipInString);   
  37.         return new BigInteger(bytes);   
  38.     }   
  39.   
  40.     /**  
  41.      * 将整数形式的ip地址转换为字符串形式  
  42.      *   
  43.      * @param ipInBigInt  
  44.      *            整数形式的ip地址  
  45.      * @return 字符串形式的ip地址  
  46.      */  
  47.     public static String BigIntToString(BigInteger ipInBigInt) {   
  48.         byte[] bytes = ipInBigInt.toByteArray();   
  49.         byte[] unsignedBytes = bytes;   
  50.   
  51.         // 去除符号位   
  52.         try {   
  53.             String ip = InetAddress.getByAddress(unsignedBytes).toString();   
  54.             return ip.substring(ip.indexOf('/') + 1).trim();   
  55.         } catch (UnknownHostException e) {   
  56.             throw new RuntimeException(e);   
  57.         }   
  58.     }   
  59.   
  60.     /**  
  61.      * ipv6地址转有符号byte[17]  
  62.      * @param   ipv6 字符串形式的IP地址  
  63.      * @return big integer number  
  64.      */  
  65.     private static byte[] ipv6ToBytes(String ipv6) {   
  66.         byte[] ret = new byte[17];   
  67.         ret[0] = 0;   
  68.         int ib = 16;   
  69.         boolean comFlag = false;// ipv4混合模式标记   
  70.         if (ipv6.startsWith(":"))// 去掉开头的冒号   
  71.             ipv6 = ipv6.substring(1);   
  72.         String groups[] = ipv6.split(":");   
  73.         for (int ig = groups.length - 1; ig > -1; ig--) {// 反向扫描   
  74.             if (groups[ig].contains(".")) {   
  75.                 // 出现ipv4混合模式   
  76.                 byte[] temp = ipv4ToBytes(groups[ig]);   
  77.                 ret[ib--] = temp[4];   
  78.                 ret[ib--] = temp[3];   
  79.                 ret[ib--] = temp[2];   
  80.                 ret[ib--] = temp[1];   
  81.                 comFlag = true;   
  82.             } else if ("".equals(groups[ig])) {   
  83.                 // 出现零长度压缩,计算缺少的组数   
  84.                 int zlg = 9 - (groups.length + (comFlag ? 1 : 0));   
  85.                 while (zlg-- > 0) {// 将这些组置0   
  86.                     ret[ib--] = 0;   
  87.                     ret[ib--] = 0;   
  88.                 }   
  89.             } else {   
  90.                 int temp = Integer.parseInt(groups[ig], 16);   
  91.                 ret[ib--] = (byte) temp;   
  92.                 ret[ib--] = (byte) (temp >> 8);   
  93.             }   
  94.         }   
  95.         return ret;   
  96.     }   
  97.   
  98.     /**  
  99.      * ipv4地址转有符号byte[5]  
  100.      * @param ipv4 字符串的IPV4地址  
  101.      * @return big integer number  
  102.      */  
  103.     private static byte[] ipv4ToBytes(String ipv4) {   
  104.         byte[] ret = new byte[5];   
  105.         ret[0] = 0;   
  106.         // 先找到IP地址字符串中.的位置   
  107.         int position1 = ipv4.indexOf(".");   
  108.         int position2 = ipv4.indexOf(".", position1 + 1);   
  109.         int position3 = ipv4.indexOf(".", position2 + 1);   
  110.         // 将每个.之间的字符串转换成整型   
  111.         ret[1] = (byte) Integer.parseInt(ipv4.substring(0, position1));   
  112.         ret[2] = (byte) Integer.parseInt(ipv4.substring(position1 + 1,   
  113.                 position2));   
  114.         ret[3] = (byte) Integer.parseInt(ipv4.substring(position2 + 1,   
  115.                 position3));   
  116.         ret[4] = (byte) Integer.parseInt(ipv4.substring(position3 + 1));   
  117.         return ret;   
  118.     }   
  119.     /**  
  120.      *   
  121.      * @param tip   要限制的Ip 包括Ipv6  
  122.      * @param sip   限制的开始Ip  
  123.      * @param eip   限制的结束Ip  
  124.      * @return  Boolean true通过  
  125.      *      false 受限制  
  126.      */  
  127.     public static boolean IsIp(String tip,String[][] myRange){   
  128.         boolean flag = false;   
  129.         //tbig 要测试的大数   
  130.         BigInteger tbig = IpLimit.StringToBigInt(tip);   
  131.         int rangeLength = myRange.length;   
  132.            
  133.         for(int i=0;i<rangeLength;i++)   
  134.         {   
  135.             for(int j=0;j<myRange[i].length;j++)   
  136.             {   
  137.                 //开始大数sbig和ebig   
  138.                 BigInteger sbig = IpLimit.StringToBigInt(myRange[i][j]);   
  139.                 j = j+1;   
  140.                 BigInteger ebig = IpLimit.StringToBigInt(myRange[i][j]);   
  141.                 //将大数进行比较   
  142.                 //如果相等则退出循环   
  143.                 if((tbig.compareTo(sbig)) == 0){   
  144.                     flag = true;   
  145.                     break;   
  146.                 }   
  147.                 //如果不相等则比较大小,在区间内正常   
  148.                 if(((tbig.compareTo(sbig)) == 1)   
  149.                         &&((tbig.compareTo(ebig)) == -1)){   
  150.                     flag = true;   
  151.                     break;   
  152.                 }   
  153.                    
  154.             }   
  155.         }   
  156.         return flag;   
  157.     }   
  158.     /**  
  159.      * 测试程序  
  160.      * @param args  
  161.      */  
  162.     public static void main(String args[]){   
  163.            
  164.         /*  
  165.         String ip = new String("192.168.0.1");  
  166.         BigInteger number = IpLimit.StringToBigInt(ip);  
  167.         String sip = "192.168.10.0";  
  168.         String eip = "192.168.10.255";  
  169.         System.out.println("The number ="+number);  
  170.         boolean flag = false;  
  171.         flag = IpLimit.IsIp(ip, sip, eip);  
  172.         System.out.println("The int n="+flag);  
  173.         //System.out.println("the m ="+m);  
  174.           
  175.         //String myip = IpLimit.BigIntToString(number);  
  176.         //System.out.println("The ipv4 ="+myip);  
  177.         String ip6 = "e80:a5eb:8fc8::7ec6:8027";  
  178.         //String ip6 = "21DA:D3:AD:2F3B::9C5A";  
  179.         BigInteger num = IpLimit.StringToBigInt(ip6);  
  180.         System.out.println("The Ipv6 number ="+num);  
  181.         String myip6 = IpLimit.BigIntToString(num);  
  182.         System.out.println("The IPv6 ="+myip6);  
  183.         */  
  184.            
  185.         //单IP限制必须写全两个   
  186.         String[][] iplimit1 ={   
  187.                 {"192.168.0.1","192.168.0.255"},   
  188.                 {"10.210.71.0","10.210.71.255"},   
  189.                 {"202.106.182.158","202.106.182.158"}   
  190.                 };   
  191.         boolean flag = false;   
  192.         String ip = "202.106.182.158";   
  193.         flag = IpLimit.IsIp(ip, iplimit1);   
  194.         System.out.println("The first test ="+flag);   
  195.            
  196.         String ip1 = "201.101.102.21";   
  197.         flag = IpLimit.IsIp(ip1, iplimit1);   
  198.         System.out.println("The other test ="+flag);   
  199.     }   
  200. }  
  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓