Javascript NETMASK和CIDR转换

时间:2013-10-23 03:23:52

标签: javascript node.js

我期待找到数百个函数示例来转换为CIDR和NETMASK for javascript,但无法找到任何函数。

我需要在nodejs页面上与CIDR和NETMASKS进行转换,该页面使用NETCTL设置和检索机器的IP地址。

使用javascript / nodejs做任何简单的解决方案??

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

    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 ..所以,它是第二个cloumn中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)}`)
})




答案 2 :(得分: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

转换方法与其他答案基本相同

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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