给定 IP 字符串,我如何计算 IP 范围x.x.x.x/x
最常见的情况可能是198.162.1.1/24
但可以是任何东西,任何法律允许的东西。
我要拿198.162.1.1/24
并将其转换为
198.162.1.1 - 198.162.1.124 或任何合法的等效项。所以试图弄清楚如何用 javascript 以数学方式和动态地解决这个问题。
子网的基地址:IP 地址和(和)网络掩码。
最高地址:基地址在网络掩码为零的位置用 1 代替 0 填充。
e.g.: 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。
high: 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('.')];
}
console.log(getIpRangeFromAddressAndNetmask("192.168.138.0/23"));
console.log(getIpRangeFromAddressAndNetmask("192.168.138.0/255.255.254.0"));
工作jsfiddle:https://jsfiddle.net/kLjdLadv/ https://jsfiddle.net/kLjdLadv/
缺少验证。你可以自己做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)