JS 根据子网掩码,网关计算出所有IP地址范围示例


Posted in Javascript onApril 23, 2020
// 验证IP的正则
var ip_reg = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;

// 验证子网掩码的正则
var mask_reg = /^(254|252|248|240|224|192|128|0)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)$/;

/***把IP地址转换成二进制格式*
@param string  ip  待转换的IP的地址*/
function ip_to_binary(ip)
{
  if (ip_reg.test(ip)) {
    var ip_str = "",
      ip_arr = ip.split(".");

    for (var i = 0; i < 4; i++) {
      curr_num = ip_arr[i];
      number_bin = parseInt(curr_num);
      number_bin = number_bin.toString(2);
      count = 8 - number_bin.length;
      for (var j = 0; j < count; j++) {
        number_bin = "0" + number_bin;
      }
      ip_str += number_bin;
    }
    return ip_str;
  }

  return '';
}

/***
把二进制格式转换成IP地址*
@param string  binary  待转换的二进制
*/
function binary_to_ip(binary)
{
  if (binary.length == 32) {
    a = parseInt(binary.substr(0, 8), 2);
    b = parseInt(binary.substr(8, 8), 2);
    c = parseInt(binary.substr(16, 8), 2);
    d = parseInt(binary.slice(-8), 2);

    return a + '.' + b + '.' + c + '.' + d;
  }

  return '';
}


/***
根据子网掩码和网关计算网络地址和广播地址*
@param string  mask  子网掩码*
@param string  gateway 网关*/
function get_network_broadcast_addr(mask, gateway)
{
  network_broadcast = [];
  network_addr = "";
  
  mask_arr = mask.split(".");
  ip_arr = ip.split(".");
  
  // 计算IP的网络地址 与(&)运算
  for (var i = 0; i < 4; i++) {
    number1 = parseInt(mask_arr[i]);
    number2 = parseInt(ip_arr[i]);
    network_addr += number1 & number2;
    if( i < 3 ){
      network_addr += ".";
    }
  }
  network_broadcast.push(network_addr);

  // 计算广播地址
  // 子掩码后面有几个0,就去掉IP地址后几位再补1
  mask_binary = ip_to_binary(mask);
  gateway_binary = ip_to_binary(ip);
  
  mask_zero = mask_binary.split(0).length - 1;
  one_number = new Array(mask_zero + 1).join('1'); // IP地址后位补1
  gateway_hou_wei_bu_yi = gateway_binary.slice(0, -mask_zero) + one_number;

  network_broadcast.push(binary_to_ip(gateway_hou_wei_bu_yi));

  return network_broadcast;
}

// 全排列组合算法(两两递归组合)
function doExchange(doubleArrays)
{
  var len = doubleArrays.length;
  if(len >= 2){
    var len1 = doubleArrays[0].length;
    var len2 = doubleArrays[1].length;
    var newlen = len1 * len2;
    var temp = new Array(newlen);
    var index = 0;
    for(var i = 0; i < len1; i++){
      for(var j = 0; j < len2; j++){
        temp[index] = doubleArrays[0][i] + '.' + doubleArrays[1][j];
        index++;
      }
    }

    var newArray = new Array(len - 1);
    for(var i = 2; i < len; i++){
      newArray[i - 1] = doubleArrays[i];
    }
    newArray[0] = temp;

    return doExchange(newArray);

  } else{
    return doubleArrays[0];
  }
}

/***
获取由网络地址和广播址组成的所有IP组合*
@param string  network_addr  网络地址*
@param string  broadcast_addr 广播地址*
@param string  gateway     网关*/
function return_ip(network_addr, broadcast_addr, gateway)
{
  range = [];
  start = network_addr.split(".");
  end = broadcast.split(".");

  // range格式为[[192], [168], [0,1,2...254], [0,1,2...254]]
  for (var i = 0; i < 4; i++) {
    if (start[i] == end[i]) {
      range[i] = [start[i]];
    } else {
      min = Math.min(start[i], end[i]);
      max = Math.max(start[i], end[i]);
      temp = [];


  if (i == 3) min = 199; // 从200起计
      for (var j = min; j <= max; j++) {
        temp.push(j);
      }
      range[i] = temp;
    }
  }

  ip_list = doExchange(range);
  ip_list.shift(); // 去掉网络地址
  ip_list.pop(); // 去掉广播地址
  gateway_index = -1;
  
  // 去掉网关
  for (var k = 0; k < ip_list.length; k++) {
    if (ip_list[k] == gateway) {
      gateway_index = k;
      break;
    }
  }
  if (gateway_index > -1) {
    ip_list.splice(gateway_index, 1);
  }

  return ip_list;
}
Javascript 相关文章推荐
JavaScript和ActionScript的交互实现代码
Aug 01 Javascript
基于JQuery实现的类似购物商城的购物车
Dec 06 Javascript
js创建元素(节点)示例
Jan 02 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
Jun 07 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
Mar 04 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
微信小程序自定义模态对话框实例详解
Aug 16 Javascript
jQuery实现滚动效果
Nov 17 jQuery
vue.js实现点击后动态添加class及删除同级class的实现代码
Apr 04 Javascript
JS实现十分钟倒计时代码实例
Oct 18 Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 Javascript
jQuery遍历节点树方法分析
Sep 08 #Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
Sep 08 #Javascript
jQuery ready()和onload的加载耗时分析
Sep 08 #Javascript
Angularjs实现mvvm式的选项卡示例代码
Sep 08 #Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
Sep 08 #Javascript
jQuery事件绑定用法详解
Sep 08 #Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
Sep 08 #Javascript
You might like
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
js拦截alert对话框另类应用
2013/01/16 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
JS实现轮播图效果
2020/01/11 Javascript
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
简单了解python关系(比较)运算符
2019/07/08 Python
PyTorch预训练的实现
2019/09/18 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
Python hashlib模块实例使用详解
2019/12/24 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
Servlet方面面试题
2016/09/28 面试题
药品质量检测应届生求职信
2013/11/14 职场文书
培训主管的岗位职责
2013/11/23 职场文书
护理专业自荐信
2013/12/03 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
工程安全生产协议书
2014/11/21 职场文书
植物园观后感
2015/06/11 职场文书
企业文化学习心得体会
2016/01/21 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers