首页 > 解决方案 > 如何从 Javascript 中的 IPv6 前缀生成 IPv6 掩码?

问题描述

在 javascript / typescript 中实现一个函数,将 IPv6 前缀(0 到 128)转换为相应的掩码(ffff:ffff 样式) 。

例子:


33 => 'ffff:ffff:8000:0000:0000:0000:0000:0000'

128 => 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'

118 => 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fc00'

标签: javascripttypescriptipv6

解决方案


以下程序将给定前缀转换为 IPv6 掩码。

我使用http://ip-address.js.org/#address6进行其他 IP 验证,但它没有此掩码转换功能。


const HEX = 16;
const BINARY = 2;
const MAX_PREFIX = 128;
const MIN_PREFIX = 0;
   /**
   *
   * @param prefix
   * @returns ipv6 netmask address
   *
   * Fill an array with 1s for given number of prefix bits
   * Fill the remaining bits with 0s
   * chunk it with 16 elements and covert each chunk to hex
   *
   */
  static getNetmaskForPrefix(prefix: number): string {

    const prefixArr: number[] = new Array(prefix).fill(1);
    const chunkArr = Array.from({
      length: Math.ceil(prefixArr.length / HEX),
    }, (_v, i) => prefixArr.slice(i * HEX, i * HEX + HEX));

    // Converting from binary to hex
    let subnet = chunkArr.map((item) => {
      return parseInt(item.join('').padEnd(HEX, '0'), BINARY).toString(HEX);
    }).join(':');

    if (subnet.length < 35) {
      subnet = `${subnet}::`;
    }

    return subnet;
  }


推荐阅读