js IP效验,IP+掩码计算网络地址、广播地址、可用地址范围
- IP效验
let iputils = {
};
iputils.checkIp = function(ip) {
var exp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
var reg = ip.match(exp);
return reg != null;
};
- 根据掩码获取掩码地址
iputils.getSubnetMask = function(mask) {
var result='';
var sum = 32;
var m = Number(mask);
sum = sum-m;
var str = "";
for(var i=0;i<m;i++) {
str = str+"1";
}
for(var j=0;j<sum;j++) {
str = str+"0";
}
var arr = ['','','',''];
for(var l=0;l<arr.length;l++) {
arr[l]=str.substring(l*8,(l+1)*8);
if(""==result)
result = result+iputils.add(arr[l]);
else result = result+"."+iputils.add(arr[l]);
}
return result;
}
iputils.add = function(s) {
var str='';
var count=0;
var temp = s.toString();
for (var i = 0; i < temp.length; i++) {
str=temp.substring(temp.length-i-1,temp.length-i);
if(Number(str)==0)
count+=0;
else if(i==0)
count+=1;
else
count+=iputils.addc(i);
}
return count;
}
iputils.addc = function(i) {
var v=1;
for (var j = 0; j < i; j++) {
v=v*2
}
return v;
}
- 根据IP与掩码地址获取网络地址
iputils.getNetAddress = function(ip, subnetMask) {
var ip_str = '';
var ip_arr = ip.split(".");
var mask_arr = subnetMask.split(".");
var ip2 = Number(ip_arr[2]);
var ip3 = Number(ip_arr[3]);
var mask2 = Number(mask_arr[2]);
var mask3 = Number(mask_arr[3]);
ip_str=(ip2&mask2)+"."+(ip3&mask3);
ip_str = ip_arr[0]+"."+ip_arr[1]+"."+ip_str;
return ip_str;
}
- 根据网络地址与主机位0的个数获取广播地址
iputils.getBroadcastAddress = function(netAddress, localNumber){
var netArr = netAddress.split(".");
var length = netArr.length;
var more = localNumber%8;
var except = parseInt(localNumber/8);
if(more!=0)
++except;
except = length - except;
for(var i=except;i<length;i++) {
var netPart = Number(netArr[i]);
var temp = iputils.convertBinary(netPart);
if(""==temp) {
temp="00000000";
}
if(i==except) {
if(more==0) {
temp="11111111";
}else {
temp = temp.substring(0,8-more)+iputils.getNumber(more);
}
var result = Number(temp);
result = iputils.binaryToDecimal(result);
netArr[i]=result+"";
}else {
netArr[i]="255";
}
}
return netArr.join(".");
}
iputils.getLocalNumber = function(subnetMask){
var maskArr = subnetMask.split(".");
var length = maskArr.length;
for(var i=0;i<length;i++) {
var maskPart = Number(maskArr[i]);
var temp = iputils.convertBinary(maskPart);
if("11111111"!=temp) {
var index = temp.lastIndexOf("1")+1;
var result = (8-index)+(length-i-1)*8;
return result;
}
}
return 0;
}
iputils.convertBinary = function(sum){
var binary = "";
while (sum != 0 && sum != 1) {
binary=binary.slice(0,1)+(sum % 2)+binary.slice(1)
sum = parseInt(sum / 2);
if (sum == 0 || sum == 1) {
binary=binary.slice(0,1)+(sum % 2)+binary.slice(1)
}
}
return binary.toString();
}
iputils.getNumber = function(number){
var result = "";
for(var i=0;i<number;i++) {
result="1"+result;
}
return result;
}
iputils.binaryToDecimal = function(binaryNumber){
var decimal = 0;
var p = 0;
while(true){
if(binaryNumber == 0){
break;
}else {
var temp = binaryNumber%10;
decimal += temp*Math.pow(2, p);
binaryNumber = parseInt(binaryNumber/10);
p++;
}
}
return decimal;
}
- 根据IP与掩码地址获取网络地址
iputils.getIpRange = function(ip, mask) {
var subnetMask = iputils.getSubnetMask(mask);
var localNumber = iputils.getLocalNumber(subnetMask)
var netAddress = iputils.getNetAddress(ip, subnetMask)
var broadcastAddress = iputils.getBroadcastAddress(netAddress, localNumber)
var result = iputils.getIpRangez(netAddress, broadcastAddress);
console.log(subnetMask)
console.log(netAddress)
console.log(localNumber)
console.log(broadcastAddress)
console.log(iputils.getIpRangez(netAddress, broadcastAddress))
return result;
};
iputils.getIpRangez = function(netAddress, broadcastAddress){
var netArr = netAddress.split(".");
var number = Number(netArr[3])+1;
netArr[3] = number+"";
var broadcastArr = broadcastAddress.split(".");
number = Number(broadcastArr[3])-1;
broadcastArr[3] = number+"";
return netArr.join(".")+"-"+broadcastArr.join(".");
}