JS 根据子网掩码,网关计算出所有的IP范围
// 验证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;
}
JS 根据子网掩码,网关计算出所有的IP范围的更多相关文章
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果
今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...
- HCNP学习笔记之子网掩码的计算和划分详细
0x00 子网掩码的计算 TCP/IP网间网技术产生于大型主流机环境中,它能发展到今天的规模是当初的设计者们始料未及的.网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性,而是会 ...
- 子网掩码!如何划分子网掩码,计算IP地址
作者:chli1806 一.子网掩码的含义和根据子网掩码划分子网一个IP地址必然属于某一个网络,或者叫子网.子网掩码就是用来指定某个IP地址的网络地址的,换一句话说,就是用来划分子网的.例如,一个A类 ...
- ip地址 与子网掩码 的计算
ip地址 与子网掩码 的计算 128.0.0.0=1 192.0.0.0=2224.0.0.0=3 240.0.0.0=4 248.0.0.0=5 252.0.0.0=6 254.0.0.0=7 25 ...
- python爬虫(正则取数据)读取表格内的基金代码后爬取基金最新净值,同时写到对应的表格中,基于最近一次购买净值计算出涨跌幅(名字有点长)
最近基金跌的真够猛,虽说是定投,但大幅度下跌,有时候适当的增加定投数也是降低平均成本的一种方式 每天去看去算太费时间,写了个爬虫,让他自动抓数据后自动计算出来吧 实现逻辑: 1.创建了一个excel表 ...
- 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米
/** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...
- Excel中利用IF和TIME函数计算出上下班状态!
大家都知道现在上下班实行打卡制,制作考勤的人员需要对你上下班的时间,计算出上下班的状态,比如:迟到.早退.加班.正常等.下面为您介绍一个“帮手”. 1.打开Excel文档.如下图 ...
- PHP 计算出内存最高占用.
PHP 计算出内存最高占用. 代码可以计算出内存是否完全被使用, ini设置处:memory_limit = 1024M 代码跑完将显示如下信息: memory_limit:320M all ...
- js制作带有遮罩弹出层实现登录小窗口
要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并 ...
随机推荐
- 洛谷 P5238 整数校验器
题目描述 有些时候需要解决这样一类问题:判断一个数 x 是否合法. x 合法当且仅当其满足如下条件: x 格式合法,一个格式合法的整数要么是 0,要么由一个可加可不加的负号,一个 1 到 9 之间的数 ...
- [转] Scala 的集合类型与数组操作
[From] https://blog.csdn.net/gongxifacai_believe/article/details/81916659 版权声明:本文为博主原创文章,转载请注明出处. ht ...
- OpenERP中自定义模块卸载失败,Postgres数据库删不掉数据库,OpenERP登录不了一直在加载的问题解决方案。
解决方案也就是删除掉不用的数据库,OE会提示当前有N个Session不让Drop数据库. 对于Postgres 9.1 版本,在pgAdmin中查询以下语句: SELECT pg_terminate_ ...
- Linux网络编程服务器模型选择之并发服务器(下)
前面两篇文章(参见)分别介绍了循环服务器和简单的并发服务器网络模型,我们已经知道循环服务器模型效率较低,同一时刻只能为一个客户端提供服务,而且对于TCP模型来说,还存在单客户端长久独占与服务器的连接, ...
- accessToken的使用
1.accessToken是啥,干嘛用? 形象解释:申请调兵-->皇帝同意-->兵符-->开始调兵 拿到用户在第三方平台的唯一的标识; 获取用户的nickname,头像,邮箱等其他信 ...
- Java Servlet 缺点
1.web.xml配置比较多 2.servlet具有容器依赖性(tomcat没有启动,就没有用)
- PHP之string之rtrim()函数使用
rtrim (PHP 4, PHP 5, PHP 7) rtrim - Strip whitespace (or other characters) from the end of a string ...
- WPF中设置Border的BorderThickness属性会让背景图片产生模糊感
<!--设置BorderThickness会让border的Background图片看起来有模糊感--> <Border x:Name="border" Bord ...
- nodejs学习笔记一( sublime、atom开发环境,http模块,fs模块的初识)
http服务 let server = http.createServer(function(req,res){ }); 监听: server.listen(8080); re ...
- MySQL数据源驱动报错
报错信息:MySQL数据源驱动报错: 1.mysql8.0以上版本需要连接数据库的JDBC驱动也是8.0版本以上 com.mysql.cj.jdbc.Driver 2.MySQL高版本需要指明是否需要 ...