ipv4,ipv6起止地址判断,网段判断

一、ipv4
function checkIp(ip, range, mask){
var rangeArr = range.split(".");
var maskArr = mask.split(".");
var ipArr = ip.split(".");
var flag = true;
if(ipArr[3] == 0 || ipArr[3] == 255){
return false;
}
for(var i=0; i<4; i++){
if((rangeArr[i] & maskArr[i]) != (ipArr[i] & maskArr[i])){
flag = false;
break;
}
}
return flag;
}
function getIpNum(ip){
var ipArr = ip.split(".");
return parseInt(ipArr[0]*255*255*255+ipArr[1]*255*255+ipArr[2]*255+ipArr[3]);
}
二,ipv6
//转换成完全的ipv6地址
function convert2CompleteIpV6(ip){
var ipV6 = ip;
var index = ip.indexOf("::");
if(index > 0){
var size = 8-(ip.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:");
}
}
return ipV6;
}

//将二进制掩码转换成16进制
function bin_to_hex(mask) {
var hex_array = [{key:0,val:"0000"},{key:1,val:"0001"},{key:2,val:"0010"},{key:3,val:"0011"},{key:4,val:"0100"},{key:5,val:"0101"},{key:6,val:"0110"},{key:7,val:"0111"},
{key:8,val:"1000"},{key:9,val:"1001"},{key:'A',val:"1010"},{key:'B',val:"1011"},{key:'C',val:"1100"},{key:'D',val:"1101"},{key:'E',val:"1110"},{key:'F',val:"1111"}]
var value = ''
var list = []
var str = '';
if(parseInt(mask) != 0){
for(var i = 0; i < parseInt(mask); i++){
str += "1";
}
for(var i = 0; i < (128 - parseInt(mask)); i++){
str += "0";
}
}
while (str.length > 4) {
list.push(str.substring(0, 4))
str = str.substring(4);
}
list.push(str)
for(var i = 0; i < list.length; i++){
for(var j = 0; j < hex_array.length; j++){
if(list[i] == hex_array[j].val){
value = value.concat(hex_array[j].key)
break
}
}
}
var valArr = []
while (value.length > 4) {
valArr.push(value.substring(0, 4))
value = value.substring(4);
}
valArr.push(value);
return valArr;
}

//判断两个IPv6地址大小
function compareIPv6(addr1,addr2){
var addr1 = convert2CompleteIpV6(addr1).split(":");
var addr2 = convert2CompleteIpV6(addr2).split(":");
for(var i = 0; i < 8; i++){
if(parseInt(addr1[i], 16) != parseInt(addr2[i], 16)){
if(parseInt(addr1[i], 16) > parseInt(addr2[i], 16)){//addr1 > addr2
return "1";
}else if(parseInt(addr1[i], 16) < parseInt(addr2[i], 16)){//addr1 < addr2
return "2";
}
}
}
return "3";//地址相等
}

//比较是否同一网段
function checkIpv6 (ip, mask, range) {
var flag = true;
var mask = bin_to_hex(mask);
var ipv6 = convert2CompleteIpV6(ip).split(":");
var range = convert2CompleteIpV6(range).split(":");
 
for(var i = 0; i < 8; i++){
if((parseInt(ipv6[i], 16) & parseInt(mask[i], 16)) != (parseInt(range[i], 16) & parseInt(mask[i], 16))){
flag = false;
break;
}
}
return flag;
}
posted on 2019-04-09 16:35  rainbow727  阅读(5396)  评论(0编辑  收藏  举报