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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
JavaScript 调试器简介
Feb 21 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
Bootstrap Fileinput文件上传组件用法详解
May 10 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
Jun 19 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
Angular表格神器ui-grid应用详解
Sep 29 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 Javascript
微信小程序防止多次点击跳转(函数节流)
Sep 19 Javascript
Vue 中 a标签上href无法跳转的解决方式
Nov 12 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 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/11/25 PHP
加强版phplib的DB类
2008/03/31 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
总结js函数相关知识点
2018/02/27 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
JS实现canvas简单小画板功能
2020/06/23 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python带参数打包exe及调用方式
2019/12/21 Python
python中doctest库实例用法
2020/12/31 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
小学教师培训感言
2014/02/11 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
自荐信怎么写
2015/03/04 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书