NodeJS Javascript网络掩码和CIDR转换

bttbmeg0  于 2023-01-04  发布在  Node.js
关注(0)|答案(5)|浏览(248)

我原以为能找到数百个函数的例子来转换为JavaScript的CIDR和NETMASK,但没有找到。
我需要在nodejs页面上转换CIDR和NETMASKS,该页面使用NETCTL设置和检索计算机的IP地址。
有没有使用javascript / nodejs?的简单解决方案?

mzmfm0qo

mzmfm0qo1#

此代码可提供解决方案:

var mask = "255.255.248.0";
var maskNodes = mask.match(/(\d+)/g);
var cidr = 0;
for(var i in maskNodes)
{
  cidr += (((maskNodes[i] >>> 0).toString(2)).match(/1/g) || []).length;
}
return cidr;
dojqjjoe

dojqjjoe2#

下面是一个不检查网络掩码是否有效的方法:

const netmaskToCidr = n => n
  .split('.')
  .reduce((c, o) => c - Math.log2(256 - +o), 32)
6pp0gazn

6pp0gazn3#

NETMASK                        BINARY               CIDR
255.255.248.0       11111111.11111111.11111000.00000000 /21
255.255.0.0         11111111.11111111.00000000.00000000 /16 
255.192.0.0         11111111.11000000.00000000.00000000 /10

这就是计算CIDR的方法。因此,它是1在第二列中的出现次数。因此,我设计了一个可读的算法,如下所示:

const masks = ['255.255.255.224', '255.255.192.0', '255.0.0.0']; 
/**
* Count char in string
*/
const countCharOccurences = (string , char) => string.split(char).length - 1;

const decimalToBinary = (dec) => (dec >>> 0).toString(2);
const getNetMaskParts = (nmask) => nmask.split('.').map(Number);
const netmask2CIDR = (netmask) => 
   countCharOccurences(
     getNetMaskParts(netmask)
      .map(part => decimalToBinary(part))
      .join(''),
    '1'   
  );    


masks.forEach((mask) => {
  console.log(`Netmask =${mask}, CIDR = ${netmask2CIDR(mask)}`)
})
z9ju0rcb

z9ju0rcb4#

我知道这个问题已经提出很久了,但我只是想添加检查以确保网络掩码有效
由于掩码仅在1中的位从左向右排列时有效,因此条件会检查0中的第一位之后没有位为1。它还会检查每个组是否为0或128-255
转换的方法与其他答案基本相同

function mask2cidr(mask) {
  var cidr = ''
  for (m of mask.split('.')) {
    if (parseInt(m) > 255) { throw 'ERROR: Invalid Netmask' } // Check each group is 0-255
    if (parseInt(m) > 0 && parseInt(m) < 128) { throw 'ERROR: Invalid Netmask' }
    cidr += (m >>> 0).toString(2)
  }
  // Condition to check for validity of the netmask
  if (cidr.substring(cidr.search('0'), 32).search('1') !== -1) {
    throw 'ERROR: Invalid Netmask ' + mask
  }
  return cidr.split('1').length - 1
}
console.log(mask2cidr("255.255.248.0"))
kiz8lqtg

kiz8lqtg5#

鉴于你提到了使用node.js来实现这个,我假设你正在寻找一种在javascript中运行服务器端而不是客户端的方法,如果这是正确的,netmask npm模块涵盖了你需要做的事情吗?

相关问题