Fork me on GitHub

IPv4:根据CIDR显示地址范围

最近遇到一个很有意思的点,于是就记录下来。 

CIDR一般是由IP地址和子网掩码组成,即 IP地址/子网掩码 格式。

子网掩码表示前面地址中的前多少位,为网络位,后面部分代表主机部分。例如:192.168.12.13/18,把192.168.12.13中的 每一位转为二进制后是  “11000000  10101000  00001100  00001101”,其中“/18”中的18表示“11000000  10101000  00001100  00001101”的前18位(共32位),剩余部分为主机部分。

 

直接上方法,本方法不支持网络位全为 0的CIDR,建议加上过滤条件:

getCIDRMessage(cidrValue) {
        let value =cidrValue.split('/');
        //校验IPv4格式
        let ipv4test = /(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))/;
        if (!ipv4test.test(value[0])) {
          return { key: 'IPv4格式不正确' }
        }

        let val = value[0].split('.');
        const sub = 32 - value[1];
        let a11 = (parseInt(val[0]) << 24) | (parseInt(val[1]) << 16) | (parseInt(val[2]) << 8) | (parseInt(val[3]) << 0);
        console.log(value + '--> a11 :--->' + a11);

        a11 = a11 >> sub << sub;
        const ipSart = a11;
        const ipEnd = a11 + (1 << sub) - 1;

        //开始地址
        let rightStartIp = (ipSart >> 24 & 255) + '.' + (ipSart >> 16 & 255) + '.' + (ipSart >> 8 & 255) + '.' + (ipSart >>> 0 & 255);
        //结束地址
        let rightEndIp = (ipEnd >> 24 & 255) + '.' + (ipEnd >> 16 & 255) + '.' + (ipEnd >> 8 & 255) + '.' + (ipEnd >>> 0 & 255);

        //现在想要手动设定一个地址范围,比如只想要45个地址
        let ipRangeByHand = (a11 >>> 0 ) + 45;
        let setRange = (ipRangeByHand >>> 24) + "." + (ipRangeByHand >> 16 & 0xFF) + "." + (ipRangeByHand >> 8 & 0xFF) + "." + (ipRangeByHand >> 0 & 0xFF);

        console.log('rightStartIp :--->' + rightStartIp);
        console.log('rightEndIp :--->' + rightEndIp);
        console.log('setRange :--->' + setRange);
 }

 

例如,挡在输入框内输入“3.3.3.3/24”,其地址范围经过计算是“3.3.3.0-----3.3.3.255”。结果如 下面截图:

 

 

 

 

 

 

如有问题,请指出。本文到这里就暂时结束了,转载请注明出处。谢谢~~~~

 

好好做人,认真生活。

posted @ 2020-05-12 22:05  元芳啊  阅读(1144)  评论(0编辑  收藏  举报