计算IP地址

来源:互联网 发布:js表单提交的请求方式 编辑:程序博客网 时间:2024/04/26 06:55
/*** 作者:杨志永* 邮箱:ljy520zhiyong@163.com* 版本:V1.0* 功能:集JavaScript验证于一身* QQ: 929168233* 日期:2012-8-17**/var index = 0;function MyUtil(){//获取网络地址this.getNetWorkAddress = GetNetWorkAddress;//获取广播地址this.getBroadCaseAddress = GetBroadCaseAddress;//获取可用的主机范围地址this.getAllValidateHosts = GetAllValidateHosts;//返回默认的完整性描述this.desc = desc;}//获取网络地址function GetNetWorkAddress(ip, netmask){//将参数IP地址, 转化为数组,形式类似: var ipArray = ["192", "128", "1", "1"];var ipArray = ip.toString().split(".");//将参数netmask地址, 转化为数组,形式类似: var netmaskArray = ["255", "255", "255", "0"];var netmaskArray = netmask.toString().split(".");//这个变量用来保存结果,即网络地址的字符串形式表示var networkAddress = "";//开始计算网络地址,公式: 网络地址=IP地址&netmask地址for (var i=0; i<ipArray.length; i++){//if的判断只是用来使用最后的结果形式为: xxx.xxx.xxx.xxx//将最后一个小数点“.”去掉。如果不作判断,结果为:xxx.xxx.xxx.xxx.//这样就会在结尾多出一个小数点。if ( i == (ipArray.length-1) ){//将IP地址与netmask地址相对应的部分作与运算,然后将结果累加到networkAddress中。networkAddress += ( (ipArray[i]) & parseInt(netmaskArray[i]) );}else{//将IP地址与netmask地址相对应的部分作与运算,然后将结果累加到networkAddress中。networkAddress += ( (ipArray[i]) & parseInt(netmaskArray[i]) ) + ".";}}//返回 网络地址 的字符串形式表示return ( networkAddress );}function GetBroadCaseAddress(ip, netmask){//将参数netmask地址, 转化为数组,形式类似: var netmaskArray = ["255", "255", "255", "0"]; var netmaskArray = netmask.toString().split(".")  //255, 255, 255, 0//这个变量用来保存 netmask 以二进制形式保存时的数组,形式类似:// ["11111111", "11111111", "11111111", "00000000"]var netmaskBinArray = new Array();//将参数network地址, 转化为数组,形式类似: var networkArray = ["192", "168", "1", "0"];var networkArray = GetNetWorkAddress(ip, netmask).toString().split(".");//这个变量用来保存 network 地址转化成二进制后的数组。形式类似:// ["11111111", "11111111", "11111111", "00000000"]var networkBinArray = new Array();//设置一个临时变量,用来保存临时的结果var tmp_string = "";//设置一个临时数组变量,用来保存临时的数组的结果var tmp_array = [0,0,0,0,0,0,0,0];//netmask 的二进制形式的字符串var netmaskString = ""; //network 的二进制形式的字符串 var networkString = "";//用来保存 广播地址 的数组var broadcaseArray = new Array();//用来保存 广播地址 的最后结果,以字符串形式表示var broadcaseString = "";//设置一个计时器,用来将一个32位的二进制数组分成4组,每数8个数据var counter = 0;//在使用之前清空变量netmaskString = "";var tmptmp = "";tmp_array = [0,0,0,0,0,0,0,0];for (var i=0; i<netmaskArray.length; i++){ //第i部分的二进制形式的 netmask数组 //即将 十进制的 netmask 数据转化为 相应的二进制的形式数据 //形式类似: ["1", "1", "1", "1", "1", "1", "1", "1"]tmp_string = parseInt(netmaskArray[i]).toString(2).split("");//如果结果不足八位,则在前面用0来补充,即将结果保存在 临时数组变量 中,要注意相应的位置while ( tmp_string.length != 8 ){for (var qq=8-tmp_string.length, j=0; qq<8 && j< tmp_string.length; qq++, j++){tmp_array[qq] = tmp_string[j];}tmp_string = tmp_array;}if (i == netmaskArray.length -1){netmaskString += tmp_string;}else{netmaskString += tmp_string + ",";}}//将 netmaskString 转化为 netmask 数组,是二进制的形式netmaskBinArray = netmaskString.split(","); //将第一次出现0的位置的索引保存var indexOfZeroInnetmaskBinArray = netmaskBinArray.indexOf("0", 0);index = (32 - indexOfZeroInnetmaskBinArray);//将 临时数组变量 清空,以备下一次使用tmp_array = [0,0,0,0,0,0,0,0];for (var i=0; i<networkArray.length; i++){ //将 network 地址的第i部分转化为 二进制形式的数组tmp_string = parseInt(networkArray[i]).toString(2).split("");//如果结果不足八位,则在前面用0来补充,即将结果保存在 临时数组变量 中,要注意相应的位置while ( tmp_string.length != 8 ){for (var qq=8-tmp_string.length, j=0; qq<8 && j< tmp_string.length; qq++, j++){tmp_array[qq] = tmp_string[j];}tmp_string = tmp_array;}if (i == networkArray.length -1){networkString += tmp_string}else{networkString += tmp_string + ",";}}// 将network二进制形式的字符串转化为 network 的二进制形式的数组networkBinArray = networkString.split(","); //公式:网络地址中的网络地址部分不变,主机地址变为全1,结果就是广播地址。//这里就是将 主机地址全变为1 for (var n=indexOfZeroInnetmaskBinArray; n<networkBinArray.length; n++){networkBinArray[n] = "1";}//将 network 地址的二进制形式的数组(32位)分4组,每组8位,结果保存在 broadcaseArray 数组中。counter = 0;tmp_string = "";for (var kk=0; kk<networkBinArray.length; kk++){counter++;tmp_string  += networkBinArray[kk];if ( counter % 8 == 0 ){broadcaseArray[(counter / 8)  - 1] = tmp_string;tmp_string = "";}}//清空 broadcaseString 变量broadcaseString = "";//逐个将broadcaseArray数组中的4组二进制数转化为十进制数,结果累加到 broadcaseStringbroadcaseString += BinaryToTen(broadcaseArray[0]) + ".";broadcaseString += BinaryToTen(broadcaseArray[1]) + ".";broadcaseString += BinaryToTen(broadcaseArray[2]) + ".";broadcaseString += BinaryToTen(broadcaseArray[3]);//返回广播地址return (broadcaseString);}// 将参数中的二进制数,转化为相应的 十进制数function BinaryToTen(bin){var orignaly = bin.toString().split("");var result = new Number();if ( bin != "" ){for (var i=orignaly.length-1, j=0; i>=0 && j<orignaly.length; i--, j++){result += parseInt(orignaly[j]) * Math.pow(2, i)   ;}return result;}}//获取有效的主机IP地址范围//公式 :网络地址+1即为第一个主机地址,广播地址-1即为最后一个主机地址function GetAllValidateHosts(ip, netmask){var networkAddress = GetNetWorkAddress(ip, netmask).toString().split(".");var broadcaseAddress = GetBroadCaseAddress(ip, netmask).toString().split(".");//alert("net = " + networkAddress + "<br />" + " broad = " + broadcaseAddress);var startHost = ( parseInt(networkAddress[3]) + 1 );var endHost = ( parseInt(broadcaseAddress[3]) -1);var startString = "";var endString = "";startString += networkAddress[0] + ".";startString += networkAddress[1] + ".";startString += networkAddress[2] + ".";startString += startHost;endString += broadcaseAddress[0] + ".";endString += broadcaseAddress[1] + ".";endString += broadcaseAddress[2] + ".";endString += endHost;return (startString + "--" + endString);}// 返回默认的结果//有效主机数为: 主机的数量=2二进制的主机位数-2 function desc(ip, netmask){var string = "IP地址为:" + ip + "<br />";string += "子网掩码为:" + netmask + "<br />";string += "网络地址为:" + ( GetNetWorkAddress(ip, netmask) ) + "<br />";string += "广播地址为:" + GetBroadCaseAddress(ip, netmask) + "<br />";string += "有效主机范围为:" + GetAllValidateHosts(ip, netmask) + "<br />";string += "有效主机数共为:" + ( Math.pow(2, index) - 2 ) + "台<br />";return string;}

原创粉丝点击