2

I was expecting to find hundreds of examples of functions to convert to and from CIDR and NETMASK for javascript, but was unable to find any.

I need to convert to and from CIDR and NETMASKS on a nodejs page which sets and retrieves the IP address for a machine using NETCTL.

Any easy solutions to do this using javascript / nodejs ??

4

5 回答 5

4

这是一个不检查网络掩码是否有效的:

const netmaskToCidr = n => n
  .split('.')
  .reduce((c, o) => c - Math.log2(256 - +o), 32)
于 2019-07-23T09:29:20.030 回答
4

此代码可以提供解决方案:

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;
于 2015-09-08T11:11:39.290 回答
3
    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 在第二个 cloumn 中出现的。因此,我设计了一个可读的算法,如下所示:

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)}`)
})

于 2017-03-24T03:41:20.967 回答
2

我知道这个问题已经很久没有提出来了,但我只是想添加检查以确保网络掩码有效:

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
}

由于掩码仅在 1 中的位从左到右时才有效,因此条件检查 0 中的第一个位之后没有位为 1。它还检查每个组是 0 或 128-255

转换方法与其他答案大致相同

于 2018-10-06T16:28:20.860 回答
1

鉴于您已经提到使用 node.js 来实现这一点,我假设您正在寻找一种在 javascript 中运行此服务器端的方法,而不是客户端。如果这是正确的,网络掩码npm 模块是否涵盖了您需要做的事情?

于 2013-10-23T04:28:57.323 回答