计算IP地址

/*
*
* 作者:杨志永
* 邮箱: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组二进制数转化为十进制数,结果累加到 broadcaseString
	broadcaseString += 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值