如果给出像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以数学方式动态地计算出来。
答案 0 :(得分:7)
子网的Baseaddresse:IP-address& (和)网络掩码。
最高地址:在网络掩码为零的位置,baseaddress用1而不是0填充。
例如:198.162.1.1/24
=>
base: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('.')];
}
工作jsfiddle:http://jsfiddle.net/kLjdLadv/
缺少验证。你可以自己做。
答案 1 :(得分:2)
如果你不介意使用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)
})
输出将是该CIDR表示法的整个地址范围。
答案 2 :(得分:2)
该格式的简要概述。 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