如何在Node.js中将带连字符的IP范围转换为CIDR?

5hcedyr0  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(102)

bounty将在4天后过期。回答此问题可获得+100声望奖励。Zhenya希望引起更多关注此问题。

我有一个带连字符的IP范围,我需要将其转换为CIDR表示法,例如:
输入:70.103.242.28-70.103.242.30输出:70.103.242.28/31,70.103.242.30/32
Python有一个库(ipaddress):

cidr = ipaddress.summarize_address_range(start_ip, end_ip)

字符串
在Node.js中寻找类似的东西,但找不到。我宁愿使用一个库来实现它,而不是自己实现它。看了netmask,ip-cidr,ip 6,ip库,但看起来它们都不支持它。

j13ufse2

j13ufse21#

借用上面Michele评论中的链接问题中的函数,您可以将first-last地址转换为数字,然后在数字范围内转换以创建数组:

function addrToNum(addr) {
  return addr.split(".").reduce((acc,cur,i)=> acc += (Number(cur) << ( (3-i) * 8) ) ,0)
}
function numToAddr(num) {
  return [(num >>> 24), (num >>> 16) & 0xFF, (num >>> 8) & 0xFF, (num & 0xFF)].join(".")
}

const [firstIp, lastIp] = "70.103.242.28-70.103.242.30".split("-")
const firstNo = addrToNum(firstIp)
const lastNo = addrToNum(lastIp)
console.info(`Start: ${firstNo}, Stop: ${lastNo}`)

let ipArray = []
for (let ipNo = firstNo; ipNo <= lastNo; ipNo++) {
  let ipAddr = numToAddr(ipNo)
  ipArray.push(ipAddr)
}
console.info(`Array: [${ipArray}]`)

字符串
将此ipArray传递给CIDR.getBlocks函数(未测试):

const CIDR = require("cidr-js");
const cidr = new CIDR();
let ipBlocks = cidr.getBlocks(ipArray);

相关问题