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 相关文章推荐
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
JavaScript中json使用自己总结
Aug 13 Javascript
window.onresize 多次触发的解决方法
Nov 08 Javascript
告诉你什么是javascript的回调函数
Sep 04 Javascript
纯js实现手风琴效果
Apr 17 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
Mar 15 Javascript
JavaScript函数节流的两种写法
Apr 07 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
Feb 26 Javascript
使用JSON格式提交数据到服务端的实例代码
Apr 01 Javascript
Node.js 的 GC 机制详解
Jun 03 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
Jan 06 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
May 14 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写的采集程序
2007/03/16 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
php while循环得到循环次数
2013/10/26 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Django admin美化插件suit使用示例
2017/12/12 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
python中时间模块的基本使用教程
2019/05/14 Python
python写程序统计词频的方法
2019/07/29 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
python程序如何进行保存
2020/07/03 Python
scrapy头部修改的方法详解
2020/12/06 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
解除劳动关系协议书范文
2014/09/11 职场文书
优秀班主任申报材料
2014/12/16 职场文书
HTML+JS实现在线朗读器
2022/02/15 Javascript
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript