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