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自动判断浏览器分辨率的代码
Jan 28 Javascript
学习ExtJS fit布局使用说明
Oct 08 Javascript
jQuery的三种$()
Dec 30 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
JavaScript中的6种运算符总结
Oct 16 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
webpack 3.X学习之多页面打包的方法
Sep 04 Javascript
Element UI框架中巧用树选择器的实现
Dec 12 Javascript
微信小程序实现张图片合成为一张并下载
Jul 16 Javascript
javascript头像上传代码实例
Sep 28 Javascript
vue项目初始化到登录login页面的示例
Oct 31 Javascript
JavaScript函数柯里化
Nov 07 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 getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
python中关于for循环的碎碎念
2017/06/30 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
Python切片操作实例分析
2018/03/16 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
python中使用while循环的实例
2019/08/05 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
详解Python3 pandas.merge用法
2019/09/05 Python
python 字典访问的三种方法小结
2019/12/05 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
python能做哪方面的工作
2020/06/15 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang