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

 

 

posted on 2010-05-04 13:22  高町⑥⑥○  阅读(3573)  评论(0编辑  收藏  举报