录入IPV6地址功能总结

最近了解了IPv6地址,地址段的相关知识,IPv6的地址转换成二进制和十进制等,如下记录:

/**
* ipv6转BigInteger
* @param ipv6
* @return
*/
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++;
}
}
// ipv6 has most 7 dot
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 (StringUtils.isEmpty(str[i]))
{
str[i] = "0";
}
big = big.add(BigInteger.valueOf(Long.valueOf(str[i], 16))
.shiftLeft(16 * (str.length - i - 1)));
}
return big;
}

/**
* BigInteger转ipv6
* @param big
* @return
*/
public static String int2ipv6(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);
}
//the last :
str = str.substring(0, str.length() - 1);

return str.replaceFirst("(^|:)(0+(:|$)){2,8}", "::");
}

这两个方法是参考网上的,出处不记得了,再找也没找到了,再此记录一下。不过在处理Ipv6数据时很好用,在录入v6地址段时,要根据地址段首地址递增Math.pow(2,64-mask)个地址记录到地址表中,例如mask为40,拆分成地址段/64数量为2^24,mask是地址段的掩码。递增的话就要 ipv6转BigInteger 然后递增,递增后BigInteger再转回IPV6。代码如下:

/**
* 根据地址段拆分/64地址
* @param nameSpaceId
* @param poolId
* @param areaId
* @param networkId
* @param num
* @param ipAddrString
* @param oprStateId
* @param typeName
*/
public void createSingleIPV6(long nameSpaceId, Long poolId, long areaId,
long networkId, long num, String ipAddrString, int oprStateId,int typeName) {

//需要生成的地址数量
int nums = Integer.valueOf(String.valueOf(num));
BigInteger ipLong = null;
ipLong = ipv6toInt(ipAddrString);//将首地址编码转换BigInteger
BigInteger ip =null;
for(int j=0;j<nums;j++){
BigInteger redex = new BigInteger(String.valueOf(j));
ip = ipLong.add(redex);//递增加一
String ipHex = ip.toString(2);//转二进制
String ipToString = int2ipv6(ip);//转成v6地址
if(ipHex.length()<128){//二进制不足128位补全(分配地址时需要根据二进制给地址排序)
for(int i=0;i<128-ipHex.length();i++){
ipHex ="0"+ipHex;
}
}
NbrIpAddress nbrIpAddress = new NbrIpAddress();
nbrIpAddress.setNo(ipToString+"/64");
nbrIpAddress.setOprStateId(oprStateId);
nbrIpAddress.setAreaId(areaId);
nbrIpAddress.setNamespaceId(nameSpaceId);
nbrIpAddress.setResSpecId(Integer.valueOf(String.valueOf(ResSpecConst.IPV6_IP_SPEC)));
nbrIpAddress.setMntStateId(170351);
nbrIpAddress.setIpInt(new BigDecimal(ip.toString()));
nbrIpAddress.setIpHex(ipHex);
nbrIpAddress.setCreateDate(new Date());
if (poolId != null)
nbrIpAddress.setPoolId(poolId);
nbrIpAddress.setCreateOp(DatUtil.getStaffId());
nbrIpAddress.setPartitionId(DatUtil.getPartitionId());
nbrIpAddress.setNetworkId(networkId);
ipMgrDao.insertSelectiveByIP(nbrIpAddress);

}
}

功能很简单,主要是记录十六进制的v6地址和十进制以及二进制的转换。

猜你喜欢

转载自www.cnblogs.com/zkdn/p/10254342.html
今日推荐