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 相关文章推荐
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
jquery实现点击消失的代码
Mar 03 Javascript
JavaScript中实现单体模式分享
Jan 29 Javascript
jquery判断复选框是否选中进行答题提示特效
Dec 10 Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
js实现动态显示时间效果
Mar 06 Javascript
基于vue2.x的电商图片放大镜插件的使用
Jan 22 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
Jul 24 Javascript
three.js中多线程的使用及性能测试详解
Jan 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自动生成月历代码
2006/10/09 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
php 删除cookie方法详解
2014/12/01 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
PHP培训要多少钱
2017/06/06 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Django跨域请求原理及实现代码
2020/11/14 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
Delphi工程师笔试题
2013/09/21 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
心理健康活动总结
2014/04/30 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
班主任开场白
2015/06/01 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书