JS 根据子网掩码,网关计算出所有IP地址范围示例
//验证IP的正则
varip_reg=/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
//验证子网掩码的正则
varmask_reg=/^(254|252|248|240|224|192|128|0)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)$/;
/***把IP地址转换成二进制格式*@paramstringip待转换的IP的地址*/
functionip_to_binary(ip)
{
if(ip_reg.test(ip)){
varip_str="",
ip_arr=ip.split(".");
for(vari=0;i<4;i++){
curr_num=ip_arr[i];
number_bin=parseInt(curr_num);
number_bin=number_bin.toString(2);
count=8-number_bin.length;
for(varj=0;j<count;j++){
number_bin="0"+number_bin;
}
ip_str+=number_bin;
}
returnip_str;
}
return'';
}
/***把二进制格式转换成IP地址*@paramstringbinary待转换的二进制*/
functionbinary_to_ip(binary)
{
if(binary.length==32){
a=parseInt(binary.substr(0,8),2);
b=parseInt(binary.substr(8,8),2);
c=parseInt(binary.substr(16,8),2);
d=parseInt(binary.slice(-8),2);
returna+'.'+b+'.'+c+'.'+d;
}
return'';
}
/***根据子网掩码和网关计算网络地址和广播地址*@paramstringmask子网掩码*@paramstringgateway网关*/
functionget_network_broadcast_addr(mask,gateway)
{
network_broadcast=[];
network_addr="";
mask_arr=mask.split(".");
ip_arr=ip.split(".");
//计算IP的网络地址与(&)运算
for(vari=0;i<4;i++){
number1=parseInt(mask_arr[i]);
number2=parseInt(ip_arr[i]);
network_addr+=number1&number2;
if(i<3){
network_addr+=".";
}
}
network_broadcast.push(network_addr);
//计算广播地址
//子掩码后面有几个0,就去掉IP地址后几位再补1
mask_binary=ip_to_binary(mask);
gateway_binary=ip_to_binary(ip);
mask_zero=mask_binary.split(0).length-1;
one_number=newArray(mask_zero+1).join('1');//IP地址后位补1
gateway_hou_wei_bu_yi=gateway_binary.slice(0,-mask_zero)+one_number;
network_broadcast.push(binary_to_ip(gateway_hou_wei_bu_yi));
returnnetwork_broadcast;
}
//全排列组合算法(两两递归组合)
functiondoExchange(doubleArrays)
{
varlen=doubleArrays.length;
if(len>=2){
varlen1=doubleArrays[0].length;
varlen2=doubleArrays[1].length;
varnewlen=len1*len2;
vartemp=newArray(newlen);
varindex=0;
for(vari=0;i<len1;i++){
for(varj=0;j<len2;j++){
temp[index]=doubleArrays[0][i]+'.'+doubleArrays[1][j];
index++;
}
}
varnewArray=newArray(len-1);
for(vari=2;i<len;i++){
newArray[i-1]=doubleArrays[i];
}
newArray[0]=temp;
returndoExchange(newArray);
}else{
returndoubleArrays[0];
}
}
/***获取由网络地址和广播址组成的所有IP组合*@paramstringnetwork_addr网络地址*@paramstringbroadcast_addr广播地址*@paramstringgateway网关*/
functionreturn_ip(network_addr,broadcast_addr,gateway)
{
range=[];
start=network_addr.split(".");
end=broadcast.split(".");
//range格式为[[192],[168],[0,1,2...254],[0,1,2...254]]
for(vari=0;i<4;i++){
if(start[i]==end[i]){
range[i]=[start[i]];
}else{
min=Math.min(start[i],end[i]);
max=Math.max(start[i],end[i]);
temp=[];if(i==3)min=199;//从200起计
for(varj=min;j<=max;j++){
temp.push(j);
}
range[i]=temp;
}
}
ip_list=doExchange(range);
ip_list.shift();//去掉网络地址
ip_list.pop();//去掉广播地址
gateway_index=-1;
//去掉网关
for(vark=0;k<ip_list.length;k++){
if(ip_list[k]==gateway){
gateway_index=k;
break;
}
}
if(gateway_index>-1){
ip_list.splice(gateway_index,1);
}
returnip_list;
}
PS:这里再为大家推荐几款相关在线工具供大家参考:
在线网络计算器|TCP/IP子网掩码计算与换算工具:
http://tools.jb51.net/aideddesign/ipcalc
在线IP地址/子网掩码计算与转换工具:
http://tools.jb51.net/aideddesign/ip_net_calc
在线子网掩码换算与网络计算工具:
http://tools.jb51.net/aideddesign/network_calc