注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

JavaScript Subnet类  

2012-09-05 14:29:12|  分类: Javascript |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近项目需要,需要验证一个IP地址是否在一个子网内。
所以也在网上搜集了资料:
Apache commons 的SubnetUtils 类  org.apache.commons.net.util.SubnetUtils
SubnetUtils类的源码:
http://commons.apache.org/net/apidocs/src-html/org/apache/commons/net/util/SubnetUtils.html#line.28



参考SubnetUtils类源码,写一个JavaScript版的Subnet类
/**
 * ip: 192.168.0.33
 * mask: 255.255.255.0
 * author: hjzheng (just support ip v4)
 */
function Subnet(ip, mask) {   
    //private attribute 
    var ip = ip;
    var mask = mask;

    //private method
    function validateSubnet() {
         //...
         //...
    }

    //convert ip to ip number(decimal number)
    function ipNumber(ipAddress) {
        var ip = ipAddress.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
        if (ip) {
            return (+ip[1]<<24) + (+ip[2]<<16) + (+ip[3]<<8) + (+ip[4]);
        } else {
            throw new Error("IP format is error");
        }
    }
    //Example: 255.255.255.0 convent to 24
    function convertMaskToDec(mask) {
        var x = ipNumber(mask);
        x = x - ((x >>> 1) & 0x55555555);
        x = (x & 0x33333333) + ((x >>> 2) & 0x33333333);
        x = (x + (x >>> 4)) & 0x0F0F0F0F;
        x = x + (x >>> 8);
        x = x + (x >>> 16);
        return x = x & 0x0000003F; 
    }
 
    function ipMask(mask) {
        var x = convertMaskToDec(mask);
        return -1<<(32-x);
    }

   function toArray(val) { 
        var ret = [];
        for (var j = 3; j >= 0; --j) {
               ret[j] |= ((val >>> 8*(3-j)) & (0xff));
         }           
         return ret;
   }

   function format(octets) {
        var str = ""
        for (var i =0; i < octets.length; ++i){
             str += octets[i];
             if (i != octets.length - 1) {
                    str += ".";
              }
        }
        return str;
    }

    //privileged method 
    this.isInThisSubnet = function(ipAddress) {
        return (ipNumber(ipAddress) & ipMask(mask)) == ipNumber(this.getNetwork());
    }

    this.getBroadcast = function() {
       return format(toArray((ipNumber(ip) & ipMask(mask)) | ~(ipMask(mask))));
    } 

    this.getNetwork = function() {
        return format(toArray((ipNumber(ip) & ipMask(mask))));
    }

    this.getNetmask = function() {
        return mask;
    }
    
    this.getCidrSignature = function() {
        return ip + "/" + convertMaskToDec(mask);
    }

}

var subnet = new Subnet("192.168.0.33", "255.255.255.0");

console.log(subnet.isInThisSubnet("192.168.1.33"));
console.log(subnet.isInThisSubnet("172.17.1.33"));
console.log(subnet.isInThisSubnet("192.168.10.55"));
console.log(subnet.isInThisSubnet("192.168.0.7"));
console.log(subnet.isInThisSubnet("192.168.0.0"));
console.log(subnet.isInThisSubnet("192.168.0.255"));
console.log(subnet.getBroadcast());
console.log(subnet.getNetwork());
console.log(subnet.getNetmask());
console.log(subnet.getCidrSignature());

在Firefox firebug中测试结果:
JavaScript Subnet类 - 星期五 - 星期五
  评论这张
 
阅读(467)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017