用于PON设置ipv6 Pool范围时,校验ipv6 Pool范围是否为设置的ipv6前缀的子集
前提:ipv6地址格式合法(图中1、2格式)
化简原则:
+全0块“0000”,可以化简为“0”
+多个全0块,可以化简为“::”
+一个IPv6地址中只能出现一个“::”,出现多个全0块时,“::”要化简最长的一段,没有最长的要就近(左)
+“::”可以出现在地址开头或结尾
CompareAddrPoolRange("3001::","3001::1111:111");
function CompareAddrPoolRange(Prefix,ipv6Addr){//对比前缀与地址池起始地址前缀是否相同
var addr_1 = Prefix.split("/");
var addr_2 = ipv6Addr.split("/");
var prefix = addr_1[0];
var ipv6addr = addr_2[0];
var prefix_fomart = convert2CompleteIpV6(prefix).substring(0,19);
var prefix_ipv6 = convert2CompleteIpV6(ipv6addr).substring(0,19);
console.log(prefix_fomart);
console.log(prefix_ipv6);
if(prefix_fomart != prefix_ipv6){
return false;
}
return true;
}
//ipv6地址去简化
function convert2CompleteIpV6(ip){//将3001::1111:111拓展为3001:0000:0000:0000:0000:1111:111
var ipV6 = ip;
var ipv6Address;
var index = ip.indexOf("::");
if(index > 0){
var size = 8-(ipV6.split(":").length-1);
var tmp = "";
for(var i = 0; i < size; i++){
tmp += ":0000";
}
tmp += ":";
ipV6 = ip.replace("::",tmp);
}
else if(index == 0){
if(ip == "::"){
ipV6 = "0000:0000:0000:0000:0000:0000:0000:0000";
}
else{
ipV6 = ip.replace("::","0000:0000:0000:0000:0000:0000:0000:");
}
}
ipv6Address = ipv6AddrFormart(ipV6);
return ipv6Address;
}
ipv6地址标准格式化
function ipv6AddrFormart(ipV6)
{
//将3001:0000:0000:0000:0000:1111:111格式化3001:0000:0000:0000:0000:0000:1111:0111
var ipv6Address = null;
var parts = ipV6.split(":");
for(var i = 0; i < parts.length; i++){
if(parts[i].length < 4){
parts[i] = parts[i].padStart(4,'0');
}
if(i == 0){
ipv6Address = parts[i];
}else{
ipv6Address += ":" + parts[i];
}
}
return ipv6Address;
}
参考:
https://www.cnblogs.com/fps2tao/p/10766422.html
https://blog.csdn.net/weixin_30853329/article/details/98959974