如何根据一个ip段得到子网掩码的位数

pipiright 2010-01-28 04:50:41
现在想通过一个IP地址段,算出子网掩码的位数,
比如有两个ip
192.168.1.0 ~ 192.168.1.255
要得到就是192.168.1.0/24
请问javascript如何实现?谢谢.
...全文
939 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inpool 2010-01-28
  • 打赏
  • 举报
回复
刚刚赶着去吃饭,result用异或运算效率更高,而且不用关心哪个是起始IP哪个是结束IP。
再可以提出正确起始IP和结束IP的写法:
	var ip1="192.168.1.1",ip2="192.168.1.255";
var aIp1 = ip1.split("."),aIp2 = ip2.split(".");
for (var i=0,ip1=0,ip2=0; i<4; i++)
{
ip1 = (ip1 << 8) + parseInt(aIp1[i]);
ip2 = (ip2 << 8) + parseInt(aIp2[i]);
}
var result = ip2 ^ ip1;

//验证给定IP是否合法最初和最末的两个
if(/^1*$/.test(result.toString(2)))
{
var subCode = aIp1.join(".") + "/" + (32 - result.toString(2).length);
alert(subCode);
}
else
{
var valid = [];
for (i=1; i<8; i++)
{
valid.push(0xff & (0xff << i));
}
alert("IP段不合法:起始IP和结束IP第一个不是0的IP段\n必须是["+valid.join(",")+"]\n中的一个且之前的IP段必须为255!");
}
街头小贩 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 duwa789 的回复:]
引用 3 楼 xiaofanku 的回复:
明天我在js版块发贴:
求用js来描述我太太的样子!我出5K分


我分2.5k,我知道你太太肯定有鼻子有眼睛有耳朵有头发有嘴巴。
[/Quote]
你回答不全!给你0分.我只给回答完全正确的同志满分
Inpool 2010-01-28
  • 打赏
  • 举报
回复
加入验证IP段合法性:
	var ip1="192.168.1.0",ip2="192.168.1.255";
var aIp1 = ip1.split("."),aIp2 = ip2.split(".");
for (var i=0,ip1=0,ip2=0; i<4; i++)
{
ip1 = (ip1 << 8) + parseInt(aIp1[i]);
ip2 = (ip2 << 8) + parseInt(aIp2[i]);
}
result = 0xFFFFFFFF & (ip2-ip1);
//验证给定IP是否合法最初和最末的两个
if(/^1*$/.test(result.toString(2)))
{
subCode = aIp1.join(".") + "/" + (32 - result.toString(2).length);
alert(subCode);
}
else
{
alert("IP段不合法!");
}
Inpool 2010-01-28
  • 打赏
  • 举报
回复
	var ip1="192.168.1.0",ip2="192.168.1.255";
var aIp1 = ip1.split("."),aIp2 = ip2.split(".");
for (var i=0,ip1=0,ip2=0; i<4; i++)
{
ip1 = (ip1 << 8) + parseInt(aIp1[i]);
ip2 = (ip2 << 8) + parseInt(aIp2[i]);
}
result = 0xFFFFFFFF & (ip2-ip1);
subCode = aIp1.join(".") + "/" + (32 - result.toString(2).length);
alert(subCode);
duwa789 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaofanku 的回复:]
明天我在js版块发贴:
求用js来描述我太太的样子!我出5K分
[/Quote]

我分2.5k,我知道你太太肯定有鼻子有眼睛有耳朵有头发有嘴巴。
pipiright 2010-01-28
  • 打赏
  • 举报
回复
找到一个例子, 不过是根据IP和掩码位数算IP段的,不知道怎么把它反过来


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>无标题页</title>

<script language="javascript" type="text/javascript">
/*
计算可用IP段
*/
function getIPs()
{
var zjip=document.getElementById("zjip");
var zjdz=document.getElementById("zjdz");
var ymws=document.getElementById("ymws");
if(validateIP(zjip.value))
{
if(validateMask(parseInt(ymws.value,10)))
{
//显示主机IP得二进制
var ipaddress = zjip.value.split(".");
var intipaddress=new Array(4);
intipaddress[0]= Number(ipaddress[0]);
intipaddress[1]= Number(ipaddress[1]);
intipaddress[2]= Number(ipaddress[2]);
intipaddress[3]= Number(ipaddress[3]);

var zjip_e=left0(intipaddress[0].toString(2))+left0(intipaddress[1].toString(2))+left0(intipaddress[2].toString(2))+left0(intipaddress[3].toString(2));
zjdz.innerHTML=zjip_e;

//显示子网掩码
var ym=maskNum(parseInt(ymws.value));
zwym.innerHTML=ym;

zwdz.innerHTML=getzwdz(zjip_e,ym);

//起始IP
var qsip1=left0((parseInt(zwdz.innerHTML.substr(0,8),2)).toString(2));
var qsip2=left0((parseInt(zwdz.innerHTML.substr(8,8),2)).toString(2));
var qsip3=left0((parseInt(zwdz.innerHTML.substr(16,8),2)).toString(2));
var qsip4=left0((parseInt(zwdz.innerHTML.substr(24,8),2)+1).toString(2));

IP1.innerHTML=parseInt(qsip1,2).toString(10)+"."+parseInt(qsip2,2).toString(10)+"."+parseInt(qsip3,2).toString(10)+"."+parseInt(qsip4,2).toString(10);

var gb=gbdz(zwdz.innerHTML,ym);
var zzip1=left0((parseInt(gb.substr(0,8),2)).toString(2));
var zzip2=left0((parseInt(gb.substr(8,8),2)).toString(2));
var zzip3=left0((parseInt(gb.substr(16,8),2)).toString(2));
var zzip4=left0((parseInt(gb.substr(24,8),2)-1).toString(2));

IP2.innerHTML=parseInt(zzip1,2).toString(10)+"."+parseInt(zzip2,2).toString(10)+"."+parseInt(zzip3,2).toString(10)+"."+parseInt(zzip4,2).toString(10);

}
else
{
alert('掩码位数是不大于32的正整数!');
}
}
else
{
alert('请输入正确得IP地址!');
}
}

function getzwdz(strZJ,strYM)
{
var i=0;
var zwdz="";
while(i!=32)
{
if(strZJ.substr(i,1)==strYM.substr(i,1)&&strZJ.substr(i,1)=="1")
{
zwdz=zwdz+"1";
}
else
{
zwdz=zwdz+"0";
}
i=i+1;
}
return zwdz;
}

function gbdz(strZW,strYM)
{
var i=0;
var gbdz="";
while(i!=32)
{
if(strZW.substr(i,1)==strYM.substr(i,1))
{
gbdz=gbdz+"1";
}
else
{
gbdz=gbdz+"0";
}
i=i+1;
}
return gbdz;
}

function left0(num)
{
while(num.length!=8)
{
num="0"+num;
}
return num;
}

/*
验证主机IP是否合法
*/
function validateIP(strIP)
{
var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g
if(re.test(strIP))
{
if( RegExp.$1 <256 && RegExp.$2<256 && RegExp.$3<256 && RegExp.$4<256) return true;
}
return false;
}

/*
验证掩码位数是否合法
*/
function validateMask(intNum)
{
if(intNum>0&&intNum<33)
return true;
else
return false;
}

/*
计算子网掩码
*/
function maskNum(num)
{
var mask="";
while(mask.length!=num)
{
mask="1"+mask;
}

while(mask.length!=32)
{
mask=mask+"0";
}
return mask;
}
</script>

</head>
<body>
主 机 IP:<input id="zjip" type="text" /><br />
<br />
掩码位数:<input id="ymws" type="text" /><br />
<br />
<input id="Button1" type="button" value="button" onclick="getIPs()" /><br />
<br />
主机地址:<label id="zjdz"></label><br />
子网掩码:<label id="zwym"></label><br />
子网地址:<label id="zwdz"></label><br />
可用IP:<label id="IP1"></label>到<label id="IP2"></label>
</body>
</html>
街头小贩 2010-01-28
  • 打赏
  • 举报
回复
明天我在js版块发贴:
求用js来描述我太太的样子!我出5K分
phoeni_xin 2010-01-28
  • 打赏
  • 举报
回复
。。20分。。

街头小贩 2010-01-28
  • 打赏
  • 举报
回复
无语了!

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧