需求:给出ip/掩码的形式,求出起始地址和结束地址,例如6.61.252.0/24的起始地址为6.61.252.1,结束地址为6.61.252.254。
代码:因为我是在页面做处理,所以写的是js代码
1、计算起始地址
传入的参数第一个为ip,比如例子中的6.61.252.0。第二个参数为掩码的ip格式,例子中给出的是整数形式,需要进行转换,转换代码见下面
/**
* 计算子网起始地址(不包括网络地址)
*
*/
function getLowAddr(ip, netMask){
var lowAddr = "";
var ipArray = new Array();
var netMaskArray = new Array();
// I参数不正确
if (4 != ip.split(".").length || "" == netMask)
{
return "";
}
for (var i = 0; i < 4; i++)
{
ipArray[i] = ip.split(".")[i];
netMaskArray[i] = netMask.split(".")[i];
if (ipArray[i] > 255 || ipArray[i] < 0 || netMaskArray[i] > 255
&& netMaskArray[i] < 0)
{
return "";
}
ipArray[i] = ipArray[i] & netMaskArray[i];
}
// 构造最小地址
for (var i = 0; i < 4; i++)
{
if(i == 3){
ipArray[i] = ipArray[i] + 1;
}
if ("" == lowAddr){
lowAddr +=ipArray[i];
} else{
lowAddr += "." + ipArray[i];
}
}
return lowAddr;
}
2、计算结束地址
/**
* 计算子网终止地址(不包括广播地址)
*/
function getHighAddr(ip,netMask){
var lowAddr = getLowAddr(ip,netMask);
var hostNumber = getHostNumber(netMask);
if("" == lowAddr || hostNumber == 0){
return "";
}
var lowAddrArray = new Array();
for(var i = 0; i < 4; i++){
lowAddrArray[i] = lowAddr.split(".")[i];
if(i == 3){
lowAddrArray[i] = Number(lowAddrArray[i] - 1);
}
}
lowAddrArray[3] = lowAddrArray[3] + Number(hostNumber - 1);
//alert(lowAddrArray[3]);
if(lowAddrArray[3] > 255){
var k = parseInt(lowAddrArray[3] / 256);
//alert(k);
lowAddrArray[3] = lowAddrArray[3] % 256;
//alert(lowAddrArray[3]);
lowAddrArray[2] = Number(lowAddrArray[2]) + Number(k);
//alert(lowAddrArray[2]);
if(lowAddrArray[2] > 255){
k = parseInt(lowAddrArray[2] / 256);
lowAddrArray[2] = lowAddrArray[2] % 256;
lowAddrArray[1] = Number(lowAddrArray[1]) + Number(k);
if(lowAddrArray[1] > 255){
k = parseInt(lowAddrArray[1] / 256);
lowAddrArray[1] = lowAddrArray[1] % 256;
lowAddrArray[0] = Number(lowAddrArray[0]) + Number(k);
}
}
}
var highAddr = "";
for(var i = 0; i < 4; i++){
if(i == 3){
lowAddrArray[i] = lowAddrArray[i] - 1;
}
if("" == highAddr){
highAddr = lowAddrArray[i];
}else{
highAddr += "." + lowAddrArray[i];
}
}
return highAddr;
}
3、获取主机数
/**
* 获取主机数
*
* @param netMask
* @returns {Number}
*/
function getHostNumber(netMask){
var hostNumber = 0;
var netMaskArray = new Array();
for(var i = 0; i < 4; i++){
netMaskArray[i] = netMask.split(".")[i];
if(netMaskArray[i] < 255){
hostNumber = Math.pow(256,3-i) * (256 - netMaskArray[i]);
break;
}
}
return hostNumber;
}
4、将整数形式的掩码转换成ip格式
/**
* 转换掩码的格式
*/
function getNetMask(inetMask){
var netMask = "";
if(inetMask > 32){
return netMask;
}
//子网掩码为1占了几个字节
var num1 = parseInt(inetMask / 8);
//子网掩码的补位位数
var num2 = inetMask % 8;
var array = new Array();
for(var i = 0; i < num1; i++){
array[i] = 255;
}
for(var i = num1; i < 4; i++){
array[i] = 0;
}
for(var i = 0; i < num2; num2--){
array[num1] += Math.pow(2,8-num2);
}
netMask = array[0] + "." + array[1] + "." + array[2] + "." + array[3];
return netMask;
}