项目中需要将IPv4或IPv6地址转换成数字类型,或者将数字类型的ip地址转换成字符串的IPv4或IPv6地址。所以需要一个工具类,这篇文章记录一下自己使用的工具类。
IpUtil.java
import java.math.BigInteger;
public class IpUtil {
/**ipv4字符串转为long
*
*/
public static long ipToLong(String ipv4){
String[] splits = ipv4.split("\\.");
long l = 0;
l = l + (Long.valueOf(splits[0], 10)) << 24;
l = l + (Long.valueOf(splits[1], 10)) << 16;
l = l + (Long.valueOf(splits[2], 10)) << 8;
l = l + (Long.valueOf(splits[3], 10));
return l;
}
/**long转为ipv4字符串
*
*/
public static String longToIp(long l){
String ip = "";
ip = ip + (l >>> 24);
ip = ip + "." +((0x00ffffff & l) >>> 16);
ip = ip + "." +((0x0000ffff & l) >>> 8);
ip = ip + "." +(0x000000ff & l);
return ip;
}
/**ipv6字符串转BigInteger数
*
*/
public static BigInteger ipv6ToInt(String ipv6){
int compressIndex = ipv6.indexOf("::");
if (compressIndex != -1){
String part1s = ipv6.substring(0, compressIndex);
String part2s = ipv6.substring(compressIndex + 1);
BigInteger part1 = ipv6ToInt(part1s);
BigInteger part2 = ipv6ToInt(part2s);
int part1hasDot = 0;
char ch[] = part1s.toCharArray();
for(char c : ch){
if(c == ':'){
part1hasDot++;
}
}
return part1.shiftLeft(16 * (7 - part1hasDot)).add(part2);
}
String[] str = ipv6.split(":");
BigInteger big = BigInteger.ZERO;
for(int i = 0; i < str.length; i++){
//::1
if(str[i].isEmpty()){
str[i] = "0";
}
big = big.add(BigInteger.valueOf(Long.valueOf(str[i], 16)).shiftLeft(16 * (str.length - i - 1)));
}
return big;
}
/**BigInteger数 转为ipv6字符串
*
*/
public static String intToIpv6(BigInteger big){
String str = "";
BigInteger ff = BigInteger.valueOf(0xffff);
for (int i = 0; i < 8; i++){
str = big.and(ff).toString(16) + ":" + str;
big = big.shiftRight(16);
}
//去掉最后的:号
str = str.substring(0, str.length() - 1);
return str.replaceFirst("(^|:)(0+(:|$)){2,8}", "::");
}
/**将精简的ipv6地址扩展为全长度的ipv6地址
*
*/
public static String completeIpv6(String strIpv6){
BigInteger big = ipv6ToInt(strIpv6);
String str = big.toString(16);
String completeIpv6Str = "";
while(str.length() != 32){
str = "0" + str;
}
for (int i = 0; i <= str.length(); i += 4){
completeIpv6Str += str.substring(i, i + 4);
if ((i + 4) == str.length()){
break;
}
completeIpv6Str += ":";
}
return completeIpv6Str;
}
}