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

我想从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' ] 

我正在testingnode.js,但似乎无法得到上述范围工作,因为我想。 任何帮助表示赞赏。

标记

只是为了参考这是正确的cidrToRange代码在JavaScript中:

 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”],这正是我们需要的。

回应“卡特·科尔”我改变了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' ]