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

import  java.math.BigInteger;
import  java.net.InetAddress;
import  java.net.UnknownHostException;
import  java.util.Arrays;

/**
 * IP转换工具
 * 
 * 
@author  Takamachi660
 * 
 
*/
public   final   class  IpConvert {
    
/**
     * 防止被实例化
     
*/
    
private  IpConvert() {
    }

    
/**
     * 将字符串形式的ip地址转换为BigInteger
     * 
     * 
@param  ipInString
     *            字符串形式的ip地址
     * 
@return  整数形式的ip地址
     
*/
    
public   static  BigInteger StringToBigInt(String ipInString) {
        ipInString 
=  ipInString.replace( "   " "" );
        
byte [] bytes;
        
if  (ipInString.contains( " : " ))
            bytes 
=  ipv6ToBytes(ipInString);
        
else
            bytes 
=  ipv4ToBytes(ipInString);
        
return   new  BigInteger(bytes);
    }

    
/**
     * 将整数形式的ip地址转换为字符串形式
     * 
     * 
@param  ipInBigInt
     *            整数形式的ip地址
     * 
@return  字符串形式的ip地址
     
*/
    
public   static  String BigIntToString(BigInteger ipInBigInt) {
        
byte [] bytes  =  ipInBigInt.toByteArray();
        
byte [] unsignedBytes  =  Arrays.copyOfRange(bytes,  1 , bytes.length);
        
//  去除符号位
         try  {
            String ip 
=  InetAddress.getByAddress(unsignedBytes).toString();
            
return  ip.substring(ip.indexOf( ' / ' +   1 ).trim();
        } 
catch  (UnknownHostException e) {
            
throw   new  RuntimeException(e);
        }
    }

    
/**
     * ipv6地址转有符号byte[17]
     
*/
    
private   static   byte [] ipv6ToBytes(String ipv6) {
        
byte [] ret  =   new   byte [ 17 ];
        ret[
0 =   0 ;
        
int  ib  =   16 ;
        
boolean  comFlag  =   false ; //  ipv4混合模式标记
         if  (ipv6.startsWith( " : " )) //  去掉开头的冒号
            ipv6  =  ipv6.substring( 1 );
        String groups[] 
=  ipv6.split( " : " );
        
for  ( int  ig  =  groups.length  -   1 ; ig  >   - 1 ; ig -- ) { //  反向扫描
             if  (groups[ig].contains( " . " )) {
                
//  出现ipv4混合模式
                 byte [] temp  =  ipv4ToBytes(groups[ig]);
                ret[ib
-- =  temp[ 4 ];
                ret[ib
-- =  temp[ 3 ];
                ret[ib
-- =  temp[ 2 ];
                ret[ib
-- =  temp[ 1 ];
                comFlag 
=   true ;
            } 
else   if  ( "" .equals(groups[ig])) {
                
//  出现零长度压缩,计算缺少的组数
                 int  zlg  =   9   -  (groups.length  +  (comFlag  ?   1  :  0 ));
                
while  (zlg --   >   0 ) { //  将这些组置0
                    ret[ib -- =   0 ;
                    ret[ib
-- =   0 ;
                }
            } 
else  {
                
int  temp  =  Integer.parseInt(groups[ig],  16 );
                ret[ib
-- =  ( byte ) temp;
                ret[ib
-- =  ( byte ) (temp  >>   8 );
            }
        }
        
return  ret;
    }

    
/**
     * ipv4地址转有符号byte[5]
     
*/
    
private   static   byte [] ipv4ToBytes(String ipv4) {
        
byte [] ret  =   new   byte [ 5 ];
        ret[
0 =   0 ;
        
//  先找到IP地址字符串中.的位置
         int  position1  =  ipv4.indexOf( " . " );
        
int  position2  =  ipv4.indexOf( " . " , position1  +   1 );
        
int  position3  =  ipv4.indexOf( " . " , position2  +   1 );
        
//  将每个.之间的字符串转换成整型
        ret[ 1 =  ( byte ) Integer.parseInt(ipv4.substring( 0 , position1));
        ret[
2 =  ( byte ) Integer.parseInt(ipv4.substring(position1  +   1 ,
                position2));
        ret[
3 =  ( byte ) Integer.parseInt(ipv4.substring(position2  +   1 ,
                position3));
        ret[
4 =  ( byte ) Integer.parseInt(ipv4.substring(position3  +   1 ));
        
return  ret;
    }
}

 

 

转载于:https://www.cnblogs.com/takamachi660/archive/2010/05/04/1727150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值