Frost-ZX 2025-02-04 19:21:29

将 IP 地址转换为广播地址

javascript javascript
/**
 * @description 将 IP 地址转换为广播地址
 * @param {string} address 需要处理的 IP 地址
 * @param {string} netmask 对应的子网掩码
 */
function toBroadcastAddress(address = '', netmask = '') {

  let regExpBase = '([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])';
  let regExpFull = new RegExp(`^${regExpBase}\\.${regExpBase}\\.${regExpBase}\\.${regExpBase}$`);

  /**
    * @description 二进制转十进制整数
    * @param {string} binStr 大于或等于 0 的二进制值
    */
  let binaryToDecimal = (binStr) => {
    let result = 0;
    // 截取 1 及其后面的值,然后从后往前取
    let index = binStr.indexOf('1');
    let newStr = binStr.slice(index).split('').reverse('').join('');
    for (let i = 0; i < newStr.length; i++) {
      result += newStr[i] * Math.pow(2, i);
    }
    return result;
  };

  /**
   * @description 十进制转二进制
   * @param {number} number 大于或等于 0 的整数
   * @param {number} length 补全结果位数
   */
  let decimalToBinary = (number, length = null) => {
    let result = '';
    while (number >= 1) {
      result = number % 2 + result;
      number = Math.floor(number / 2);
    }
    if (typeof length === 'number') {
      return (result || '0').padStart(length, '0');
    } else {
      return (result || '0');
    }
  };

  if (typeof address !== 'string' || typeof netmask !== 'string') {
    console.error(prefix, '转换失败:参数数据类型错误');
    return '';
  }

  if (!regExpFull.test(address) || !regExpFull.test(netmask)) {
    console.error(prefix, '转换失败:参数格式错误');
    return '';
  }

  /** 二进制 IP 地址 */
  let addressBinary = address.split('.').map((v) => {
    return decimalToBinary(Number(v), 8);
  }).join('.');

  /** 二进制子网掩码 */
  let netmaskBinary = netmask.split('.').map((v) => {
    return decimalToBinary(Number(v), 8);
  }).join('.');

  /** 广播地址字符数组 */
  let bcastAddressArr = new Array(addressBinary.length);

  /** 广播地址字符串 */
  let bcastAddress = '';

  // 转换为二进制广播地址
  // 使用与运算计算网络地址,将表示 IP 地址主机部分的值设为 1
  for (let i = 0; i < addressBinary.length; i++) {
    let a = addressBinary[i];
    let b = netmaskBinary[i];
    switch (b) {
      // 分隔符,不处理
      case '.':
        bcastAddressArr[i] = '.';
        break;
      // 将网络地址表示 IP 地址主机部分的值设为 1
      case '0':
        bcastAddressArr[i] = '1';
        break;
      // 二进制 IP 地址和二进制子网掩码进行与运算
      default:
        bcastAddressArr[i] = String(Number(a) && Number(b));
        break;
    }
  }

  // 转换字符数组为字符串
  bcastAddress = bcastAddressArr.join('');

  // 转换为十进制 IP 地址
  return bcastAddress.split('.').map((v) => {
    return binaryToDecimal(v);
  }).join('.');

}

评论

Home - Wiki
Copyright © 2011-2025 iteam. Current version is 2.142.0. UTC+08:00, 2025-02-19 14:11
浙ICP备14020137号-1 $Map of visitor$