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的设计模式
Nov 22 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
May 16 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
Aug 31 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
jquery tmpl模板(实例讲解)
Sep 02 jQuery
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
Oct 11 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
过滤器vue.filters的使用方法实现
Sep 18 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 29 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伪静态写法附代码
2008/06/20 PHP
php类常量用法实例分析
2015/07/09 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang