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 相关文章推荐
List Installed Software Features
Jun 11 Javascript
js onkeypress与onkeydown 事件区别详细说明
Dec 13 Javascript
JS 实现导航栏悬停效果
Sep 23 Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 Javascript
jQuery实现 上升、下降、删除、添加一行代码
Mar 06 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
在knockoutjs 上自己实现的flux(实例讲解)
Dec 18 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
May 21 Javascript
JavaScript的一些小技巧分享
Jan 06 Javascript
vue打包时去掉所有的console.log
Apr 10 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模拟js函数unescape的函数代码
2012/10/20 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
js实现简单的倒计时
2021/01/28 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
python列表的常用操作方法小结
2016/05/21 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
中式餐厅创业计划书范文
2014/01/23 职场文书
培训协议书范本
2014/04/22 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
python使用torch随机初始化参数
2022/03/22 Python
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python