从IP字符串计算IP范围等于xxxx/x

chr*_*ris 2 javascript

如果像x.x.x.x/x大多数常见情况那样给出IP字符串,我怎么能或者我会计算IP的范围198.162.1.1/24可能是什么,但可以是任何合法允许的东西.

我想把198.162.1.1/24它转换成198.162.1.1 - 198.162.1.124或者等同于合法的任何东西.所以试图弄清楚如何用数学和动态地用javascript来解决这个问题.

Jos*_*a K 7

子网的Baseaddresse:IP地址和(和)网络掩码.

最高地址:在网络掩码为零的位置填充1而不是0的baseaddress.

例如:198.162.1.1/24=>

基础: 198.162.1.1 and 255.255.255.0

第1块: 198 and 255 = 198

第2块: 162 and 255 = 162

第3块: 1 and 255 = 1

第4块: 1 and 0 = 0

=> 198.162.1.0.

高: 198.162.1.0 or 0.0.0.255

块1,2和3是相同的.

第4块: 255

=> 198.162.1.255

现在一些代码(客户端js):

function getIpRangeFromAddressAndNetmask(str) {
  var part = str.split("/"); // part[0] = base address, part[1] = netmask
  var ipaddress = part[0].split('.');
  var netmaskblocks = ["0","0","0","0"];
  if(!/\d+\.\d+\.\d+\.\d+/.test(part[1])) {
    // part[1] has to be between 0 and 32
    netmaskblocks = ("1".repeat(parseInt(part[1], 10)) + "0".repeat(32-parseInt(part[1], 10))).match(/.{1,8}/g);
    netmaskblocks = netmaskblocks.map(function(el) { return parseInt(el, 2); });
  } else {
    // xxx.xxx.xxx.xxx
    netmaskblocks = part[1].split('.').map(function(el) { return parseInt(el, 10) });
  }
  // invert for creating broadcast address (highest address)
  var invertedNetmaskblocks = netmaskblocks.map(function(el) { return el ^ 255; });
  var baseAddress = ipaddress.map(function(block, idx) { return block & netmaskblocks[idx]; });
  var broadcastaddress = baseAddress.map(function(block, idx) { return block | invertedNetmaskblocks[idx]; });
  return [baseAddress.join('.'), broadcastaddress.join('.')];
}
Run Code Online (Sandbox Code Playgroud)

工作jsfiddle:http://jsfiddle.net/kLjdLadv/

验证缺失.你可以自己做.


Jef*_*ado 6

对该格式的简要概述。IP 地址 (IPv4) 是一个 32 位数字。我们经常以点分十进制形式查看它,其中 32 位数字的每个字节以点分隔的十进制形式显示。地址本身可以分为两部分,即子网和地址。斜杠后面的数字表示子网在地址中占据多少位。

要获取地址的开始和结束范围,您首先需要弄清楚该地址的子网是什么。该部分不会改变,地址范围可以从 0 到最大剩余位。

最简单的方法是将 IP 地址转换为 32 位数字形式,创建表示子网的位掩码并应用该掩码来获取地址范围。起始地址,您清除地址位,结束地址,您设置地址位。

function u(n) { return n >>> 0; } // we need to treat the numbers as unsigned
function ip(n) {
    return [
        (n >>> 24) & 0xFF,
        (n >>> 16) & 0xFF,
        (n >>>  8) & 0xFF,
        (n >>>  0) & 0xFF
    ].join('.');
}

var addr = '198.162.1.1/24',
    m = addr.match(/\d+/g),       // [ '198', '162', '1', '1', '24' ]
    addr32 = m.slice(0, 4).reduce(function (a, o) {
        return u(+a << 8) + +o;
    }),                           // 0xc6a20101
    mask = u(~0 << (32 - +m[4])); // 0xffffff00
var start = ip(u(addr32 & mask)), // 198.162.1.0
    end = ip(u(addr32 | ~mask));  // 198.162.1.255
Run Code Online (Sandbox Code Playgroud)


bbu*_*123 5

如果您不介意使用 npm 中的某些东西,那么已经有一个库可以完全满足您的需求。第一的,npm install netmask。然后运行这段代码。我使用的是节点4.1.1

"use strict"

const Netmask = require('netmask').Netmask

let block = new Netmask('198.162.1.1/24')
block.forEach( (ip, long, index) => {
  console.log("Next IP is", ip)
})
Run Code Online (Sandbox Code Playgroud)

输出将是该 CIDR 表示法的整个地址范围。