从CIDR范围中检索最大/最小IP

时间:2012-12-03 12:37:34

标签: javascript node.js

我想从CIDR块获取最大和最小IP - 我的当前代码工作正常,除了一些在最小数字上返回负数的IP。以下是我现有的代码和输出。

function long2ip (proper_address) {
// Converts an (IPv4) Internet network address into a string in Internet standard dotted format
//
// version: 1109.2015
// discuss at: http://phpjs.org/functions/long2ip
// +   original by: Waldo Malqui Silva
// *     example 1: long2ip( 3221234342 );
// *     returns 1: '192.0.34.166'
var output = false;
if (!isNaN(proper_address) && (proper_address >= 0 || proper_address <= 4294967295)) {
    output = Math.floor(proper_address / Math.pow(256, 3)) + '.' +
    Math.floor((proper_address % Math.pow(256, 3)) / Math.pow(256, 2)) + '.' +
    Math.floor(((proper_address % Math.pow(256, 3)) % Math.pow(256, 2)) / Math.pow(256, 1)) + '.' +
    Math.floor((((proper_address % Math.pow(256, 3)) % Math.pow(256, 2)) % Math.pow(256, 1)) / Math.pow(256, 0));
}
return output;
}

function cidrToRange(cidr) {
var range = [2];
cidr = cidr.split('/');
var longIp = ip2long(cidr[0]);
var mask = ((-1 << (32 - cidr[1])));
var longIp = ip2long(cidr[0]);
range[0] = long2ip(longIp & ((-1 << (32 - cidr[1]))));
range[1] = long2ip(longIp + Math.pow(2, (32 - cidr[1])) - 1);
return range;
}



console.log(cidrToRange('157.60.0.0/16')); // returns [ '-99.-196.0.0', '157.60.255.255' ]
console.log(cidrToRange('157.56.0.0/14')); // returns [ '-99.-200.0.0', '157.59.255.255' ]
console.log(cidrToRange('127.0.0.1/8')); // returns [ '127.0.0.0', '128.0.0.0' ]

我正在node.js中测试,但似乎无法按照我的意愿使上述范围工作。任何帮助表示赞赏。

标记

2 个答案:

答案 0 :(得分:4)

仅供参考,这是javascript中的正确cidrToRange代码:

function cidrToRange(cidr) {
   var range = [2];
   cidr = cidr.split('/');
   var cidr_1 = parseInt(cidr[1])
   range[0] = long2ip((ip2long(cidr[0])) & ((-1 << (32 - cidr_1))));
   start = ip2long(range[0])
   range[1] = long2ip( start + Math.pow(2, (32 - cidr_1)) - 1);
   return range;
}

例如

cidrToRange( '192.168.62.156/27') 给出[“192.168.62.128”,“192.168.62.159”],这正是我们所需要的。

答案 1 :(得分:2)

回应“Carter Cole”我通过将cidrToRange函数更改为具有不同的起点来解决问题。

function cidrToRange(cidr) {
    var range = [2];
    cidr = cidr.split('/');
    var start = ip2long(cidr[0]);
    range[0] = long2ip(start);
    range[1] = long2ip(Math.pow(2, 32 - cidr[1]) + start - 1);
    return range;
}

现在返回:

[ '157.60.0.0', '157.60.255.255' ]
[ '157.56.0.0', '157.59.255.255' ]
[ '127.0.0.1', '128.0.0.0' ]