现在想通过一个IP地址段,算出子网掩码的位数,
比如有两个ip  
  192.168.1.0 ~ 192.168.1.255 
  要得到就是192.168.1.0/24
请问javascript如何实现?谢谢.

解决方案 »

  1.   

    明天我在js版块发贴:
    求用js来描述我太太的样子!我出5K分
      

  2.   

    找到一个例子, 不过是根据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>
      

  3.   

    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);
      

  4.   

    加入验证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段不合法!");
    }
      

  5.   

    刚刚赶着去吃饭,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!");
    }