子网掩码的功能

8
我有一个子网掩码的值作为对象中的一个属性。它以长格式呈现,即 255.255.255.0 (对应 /24)。
我还没有遇到过任何用于计算这个值的 JavaScript 函数。因此,在我编写大量 if 和 else if 语句之前,我想快速确认一下是否有我不知道的 JavaScript 函数可以做到这一点。
谢谢!
编辑:
澄清一下,我想知道是否有 JavaScript 函数可以将长格式翻译成短格式并返回斜杠表示法。例如:
如果我将 var obj_mask = "255.255.255.0"; 传递给一个现有的 JavaScript(API?),它将返回一个 /24 的值。
如果 JavaScript 中不存在这样的函数,那没关系,我已经写了一半的 if 语句,我很乐意分享它,这样其他人就不必再写一遍了。但是,考虑到我刚开始学习 JS,我想知道是否本地语言中存在这样的函数/API。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Blake
补充说明,抱歉。 - misterbear
5个回答

12

我使用以下函数进行子网掩码到CIDR和CIDR到子网掩码的转换:

var netmask2CIDR = (netmask) => (netmask.split('.').map(Number)
      .map(part => (part >>> 0).toString(2))
      .join('')).split('1').length -1;

var CIDR2netmask = (bitCount) => {
  var mask=[];
  for(var i=0;i<4;i++) {
    var n = Math.min(bitCount, 8);
    mask.push(256 - Math.pow(2, 8-n));
    bitCount -= n;
  }
  return mask.join('.');
}

希望这能帮助到你!


1
这是我的最爱。 - dthree
为什么使用 .map(Number)?没有它也可以工作。 - Michael George

3

刚刚写完,突然意识到使用 switch case 会更简洁:

供大家参考。如果有任何 JavaScript 函数或 API 能够让这段代码更简洁易懂,请回答并标注。

    switch(ret_mask = path.mask) {
        case "0.0.0.0":
            return ret_mask = "/0";
        case "128.0.0.0":
            return ret_mask = "/1";
        case "192.0.0.0":
            return ret_mask = "/2";
        case "224.0.0.0":
            return ret_mask = "/3";
        case "240.0.0.0":
            return ret_mask = "/4";
        case "248.0.0.0":
            return ret_mask = "/5";
        case "252.0.0.0":
            return ret_mask = "/6";
        case "254.0.0.0":
            return ret_mask = "/7";
        case "255.0.0.0":
            return ret_mask = "/8";
        case "255.128.0.0":
            return ret_mask = "/9";
        case "255.192.0.0":
            return ret_mask = "/10";
        case "255.224.0.0":
            return ret_mask = "/11";
        case "255.240.0.0":
            return ret_mask = "/12";
        case "255.248.0.0":
            return ret_mask = "/13";
        case "255.252.0.0":
            return ret_mask = "/14";
        case "255.254.0.0":
            return ret_mask = "/15";
        case "255.255.0.0":
            return ret_mask = "/16";
        case "255.255.128.0":
            return ret_mask = "/17";
        case "255.255.192.0":
            return ret_mask = "/18";
        case "255.255.224.0":
            return ret_mask = "/19";
        case "255.255.240.0":
            return ret_mask = "/20";
        case "255.255.248.0":
            return ret_mask = "/21";
        case "255.255.252.0":
            return ret_mask = "/22";
        case "255.255.254.0":
            return ret_mask = "/23";
        case "255.255.255.0":
            return ret_mask = "/24";
        case "255.255.255.128":
            return ret_mask = "/25";
        case "255.255.255.192":
            return ret_mask = "/26";
        case "255.255.255.224":
            return ret_mask = "/27";
        case "255.255.255.240":
            return ret_mask = "/28";
        case "255.255.255.248":
            return ret_mask = "/29";
        case "255.255.255.252":
            return ret_mask = "/30";
        case "255.255.255.254":
            return ret_mask = "/31";
        case "255.255.255.255":
            return ret_mask = ""
    }

1
尝试...
/* dotted-quad IP to integer */
function IPv4_dotquadA_to_intA( strbits ) {
    var split = strbits.split( '.', 4 );
    var myInt = (
        parseFloat( split[0] * 16777216 )   /* 2^24 */
      + parseFloat( split[1] * 65536 )      /* 2^16 */
      + parseFloat( split[2] * 256 )        /* 2^8  */
      + parseFloat( split[3] )
    );
    return myInt;
}

/* integer IP to dotted-quad */
function IPv4_intA_to_dotquadA( strnum ) {
    var byte1 = ( strnum >>> 24 );
    var byte2 = ( strnum >>> 16 ) & 255;
    var byte3 = ( strnum >>>  8 ) & 255;
    var byte4 = strnum & 255;
    return ( byte1 + '.' + byte2 + '.' + byte3 + '.' + byte4 );
}

那很不错。有很多数学。它应该返回/24,使用255.255.255.0的 Flash 符号表示。 - misterbear

1

像这样使用 subnet2Mask('255.255.0.0') 并返回 16

mask2Subnet(17) 将返回 '255.255.128.0'

玩得开心

function subnet2Mask(subnet) {
  return subnet
    .split('.')
    .reduce((nbb, byte) => (
      [...Array(8).reverse().keys()]
        .reduce((nb, i) => (nb + ((byte >> i) & 1)), nbb)), 0)
}


function mask2Subnet(val) {
  return [255, 255, 255, 255]
    .map(() => [...Array(8).keys()]
      .reduce((rst) => (rst * 2 + (val-- > 0)), 0))
    .join('.')
}

0
我在这里发布了解决此类问题的方案。它可以进行优化,但为了更好的可读性,我将其保留原始状态。
    /** Convert number to address (dec) => split 
     * @param {Int}   Number
     * @return {Array} Array of 4 number
     */

     function num2Addr(number) {
           let binary = (''.padStart(32-number, '0')).padStart(32, '1'); // Create binary
           let addr = [];
           for(let i=0; i<4; i++) {
              let gBin = binary.slice(i*8, i*8+8); // Split block binary 8bit
              addr.push(parseInt(gBin,2)); // Bin to Number
           }
        return addr; // Return array of number
      }
     
    /** Convert address to dec => merge
     * @param  {Array} Address Number bit
     * @return {int}   Number
     */

     function addr2Num(addr) {
          let binary = '';
          addr.map( bit=> { binary += Number(bit).toString(2) } )
          let dec = binary.split('1').length - 1; 
           return dec;
        }
        
    // Check 
    for (let i=0; i<33; i++) {
        console.log(i, num2Addr(i) ) ;
        console.log(i, addr2Num( num2Addr(i) )  ) ;
    }

/**
Output : 
0 [ 0, 0, 0, 0 ]
0 0
1 [ 128, 0, 0, 0 ]
1 1
2 [ 192, 0, 0, 0 ]
2 2
3 [ 224, 0, 0, 0 ]
3 3
4 [ 240, 0, 0, 0 ]
4 4
5 [ 248, 0, 0, 0 ]
5 5
6 [ 252, 0, 0, 0 ]
6 6
7 [ 254, 0, 0, 0 ]
7 7
8 [ 255, 0, 0, 0 ]
8 8
9 [ 255, 128, 0, 0 ]
9 9
10 [ 255, 192, 0, 0 ]
10 10
11 [ 255, 224, 0, 0 ]
11 11
12 [ 255, 240, 0, 0 ]
12 12
13 [ 255, 248, 0, 0 ]
13 13
14 [ 255, 252, 0, 0 ]
14 14
15 [ 255, 254, 0, 0 ]
15 15
16 [ 255, 255, 0, 0 ]
16 16
17 [ 255, 255, 128, 0 ]
17 17
18 [ 255, 255, 192, 0 ]
18 18
19 [ 255, 255, 224, 0 ]
19 19
20 [ 255, 255, 240, 0 ]
20 20
21 [ 255, 255, 248, 0 ]
21 21
22 [ 255, 255, 252, 0 ]
22 22
23 [ 255, 255, 254, 0 ]
23 23
24 [ 255, 255, 255, 0 ]
24 24
25 [ 255, 255, 255, 128 ]
25 25
26 [ 255, 255, 255, 192 ]
26 26
27 [ 255, 255, 255, 224 ]
27 27
28 [ 255, 255, 255, 240 ]
28 28
29 [ 255, 255, 255, 248 ]
29 29
30 [ 255, 255, 255, 252 ]
30 30
31 [ 255, 255, 255, 254 ]
31 31
32 [ 255, 255, 255, 255 ]
32 32
*/
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接