IPV4地址范围、地址/掩码长度解析成:单个标准 IP地址

1、适用于标准 IP地址范围 解析成:单个标准 IP地址 格式,例如:192.168.1.1-192.168.1.10

//  无数多个:IP地址范围  解析 单个ip-->校验
export const analysisScope = (ipScope) => {
  // const data = ipScope //当data是数组时
  const data = ipScope.split(',') //当data是字符串时,(依逗号隔开为例)
  // 定义IP地址范围的正则表达式
  const ipRangeRegex = /^([0-9]{1,3}.){3}[0-9]{1,3}-([0-9]{1,3}.){3}[0-9]{1,3}$/;
  const ipArray = [];// 正确IP地址
  const ipRangeArray = [];// 正确IP地址范围
  const mistakeArray = [];// 错误IP地址
  // 获取 正确、错误 的IP地址范围 
  data.map((item) => {
    if (ipRangeRegex.test(item)) {
      ipRangeArray.push(item)
    } else {
      mistakeArray.push(item)
    }
  });
  // 解析 ipRangeArray数组  IP地址范围转为单个IP
  ipRangeArray.forEach(range => {
    let [start, end] = range.split("-");
    start = start.split(".").map(Number);
    end = end.split(".").map(Number);
    for (let i = start[0]; i <= end[0]; i++) {
      for (let j = start[1]; j <= end[1]; j++) {
        for (let k = start[2]; k <= end[2]; k++) {
          for (let l = start[3]; l <= end[3]; l++) {
            ipArray.push(`${i}.${j}.${k}.${l}`);
          }
        }
      }
    }
  });

  return { ipRangeArray, ipArray, mistakeArray }
};

2、适用于多个标准 IP地址/掩码长度 解析成:单个标准 IP地址 格式,例如:192.168.1.1/24


//  无数多个:IP地址/掩码长度 解析 单个ip-->校验
export const analysisSubnetMask = (ipScope) => {
  // const data = ipScope //当data是数组时
  const data = ipScope.split(',') //当data是字符串时,(依逗号隔开为例)
  // 定义IP地址范围的正则表达式
  const subnetRegex = /^([0-9]{1,3}\.){3}[0-9]{1,3}\/([0-9]|[1-2][0-9]|3[0-2])$/;
  const ipArray = [];// 正确IP地址,
  const subnetArray = [];//正确 IP地址/掩码长度
  const mistakeArray = [];//错误IP地址
  // 获取 正确、错误 的IP地址/掩码长度
  data.map((item) => {
    if (subnetRegex.test(item)) {
      subnetArray.push(item)
    } else {
      mistakeArray.push(item)
    }
  });
  // 将IP地址子网掩码 转为单个IP
  // 将IP地址转换为十进制表示
  function ipToDecimal (ip) {
    var parts = ip.split(".");
    return (parseInt(parts[0]) << 24) + (parseInt(parts[1]) << 16) + (parseInt(parts[2]) << 8) + parseInt(parts[3]);
  }
  // 将十进制表示的IP地址转换为常规IP地址
  function decimalToIp (decimal) {
    var part1 = (decimal >> 24) & 255;
    var part2 = (decimal >> 16) & 255;
    var part3 = (decimal >> 8) & 255;
    var part4 = decimal & 255;
    return part1 + "." + part2 + "." + part3 + "." + part4;
  }
  // 获取子网地址
  function getSubnet (ip, maskLength) {
    var decimalIp = ipToDecimal(ip);
    var mask = Math.pow(2, 32 - maskLength) - 1;
    var subnet = decimalIp & ~mask;
    return subnet;
  }
  // 获取广播地址
  function getBroadcast (ip, maskLength) {
    var decimalIp = ipToDecimal(ip);
    var mask = Math.pow(2, 32 - maskLength) - 1;
    var broadcast = decimalIp | mask;
    return broadcast;
  }
  // 获取可用的IP地址范围
  function getUsableIps (ip, maskLength) {
    var subnet = getSubnet(ip, maskLength);
    var broadcast = getBroadcast(ip, maskLength);
    var usableIps = [];
    for (var i = subnet + 1; i < broadcast; i++) {
      usableIps.push(decimalToIp(i));
    }
    return usableIps;
  }
  // 将IP地址和子网掩码长度转换为可用的IP地址范围
  function convertIp (ipWithMask) {
    var parts = ipWithMask.split("/");
    var ip = parts[0];
    var maskLength = parseInt(parts[1]);
    var usableIps = getUsableIps(ip, maskLength);
    return usableIps;
  }
  // 遍历子网数组,将每个子网的可用IP地址范围添加到ipArray中
  for (let i = 0; i < subnetArray.length; i++) {
    ipArray.push(...convertIp(subnetArray[i]))
  }
  // 解析  subnetArray
  return { subnetArray, ipArray, mistakeArray }
};

 3、验证:全新vue2项目

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值