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 相关文章推荐
js实现的切换面板实例代码
Jun 17 Javascript
什么是 AngularJS?AngularJS简介
Dec 06 Javascript
JS实现的简洁二级导航菜单雏形效果
Oct 13 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
Feb 21 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
使用 jQuery 实现表单验证功能
Jul 05 jQuery
浅谈es6中export和export default的作用及区别
Feb 07 Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
Node.js学习教程之Module模块
Sep 03 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
vue 单页应用和多页应用的优劣
Oct 22 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漏洞全解(详细介绍)
2012/11/13 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
php进程间通讯实例分析
2016/07/11 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
使用Turtle画正螺旋线的方法
2017/09/22 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
如何定义一个可复用的服务
2014/09/30 面试题
消防安全管理制度
2014/02/01 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
社团活动总结
2014/04/28 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
产品包装策划方案
2014/05/18 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python