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 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
Mar 21 Javascript
javascript 兼容各个浏览器的事件
Feb 04 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 Javascript
Node.js操作redis实现添加查询功能
May 25 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
Dec 26 Javascript
Vue函数式组件-你值得拥有
May 09 Javascript
发布订阅模式在vue中的实际运用实例详解
Jun 09 Javascript
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
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获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
简明json介绍
2008/09/28 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
django框架cookie和session用法实例详解
2019/12/10 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
python unichr函数知识点总结
2020/12/16 Python
学生的自我鉴定范文
2013/10/24 职场文书
一封普通求职者的求职信
2013/11/20 职场文书
总裁岗位职责
2013/12/04 职场文书
大学生活自我评价
2014/04/09 职场文书
实习生评语
2014/04/26 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
异地年检委托书范本
2014/09/24 职场文书
商务代表岗位职责
2015/02/15 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis