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转二进制
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
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 ‘‘;
}

// 根据子网掩码和网关计算出IP范围(网络地址 - 广播地址)
function get_network_broadcast_addr(mask, ip)
{
    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
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 = [];
            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;
}
时间: 2024-12-14 17:01:31

JS 根据子网掩码,网关计算出所有的IP范围的相关文章

子网掩码的计算

IP地址是32位的二进制数值,用于在TCP/IP通讯协议中标记每台计算机的地址.通常我们使用点式十进制来表示,如192.168.0.5等等.每个IP地址又可分为两部分.即网络号部分和主机号部分:网络号表示其所属的网络段编号,主机号则表示该网段中该主机的地址编号.按照网络规模的大小,IP地址可以分为A.B.C.D.E五类,其中A.B.C类是三种主要的类型地址,D类专供多目传送用的多目地址,E类用于扩展备用地址.A.B.C三类IP地址有效范围如下表: 类别 网络号 /占位数 主机号 /占位数 用途A

wap手机端页面根据dpr和宽度计算出font-size对应数值

最近在进行公司的wap端首页改版和添加活动页面,为了做的效果更好一些,就参考淘宝和京东的wap版,然后对淘宝的wap做了一些分析,淘宝的wap触屏版做的自适应和兼容性很不错,于是整理了下. wap手机端页面根据dpr和宽度计算出font-size对应数值表如下: dpr 最小宽度320px 最大宽度540px 系数 1 20px 33.75px 0.0625 2 40px 67.5px 0.125 3 60px 101.25px 0.1875 备注: 1.是按照倍数关系增加的 2.手机淘宝就是按

IP与子网掩码的计算

IP的类型 IP地址总长度不超过32Bits(位),总共有4段,每段为8位(二进制). 比如: 11111111.11111111.11111111.00000000 对应 255. 255.255.0 IP地址又分为两个位置,一个是网络为,一个是主机位 以第一段IP为基准 A类:1-126                    第一段为网络位,后三段为主机位                  标准掩码:255.0.0.0 B类: 128-191                第一第二段为网络位

子网掩码怎么计算

子网掩码怎么计算 浏览:5984 | 更新:2013-03-10 14:23 业务的发展常常会导致许多单位面临这样一个问题:工作站数量越来越多,管理单一的大型网络也变得越来越艰难.如果将一个单一的大型网络划分为多个子网,通过对每个子网进行单独管理,可以明显地提高整个网络的性能. 要划分子网就需要计算子网掩码和分配相应的主机块,尽管采用二进制计算可以得出相应的结论,但如果采用十进制计算方法,计算起来更为简便.经过长期实践与经 验积累,笔者总结出子网掩码及主机块的十进制算法. 方法一:利用子网数来计

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 255.0.0.0=8255.128.0.0=9 255.192.0.0=10 255.224.0.0=11 255.240.0.0=12 255.248.0.0=13255.252.0.0=14 255.254.0.0=15255.255.0.0=16 255.255.128.0=17255.255.

在固定宽度 下计算出实际的行高

//根据字符串内容的多少  在固定宽度 下计算出实际的行高 - (CGFloat)HelperTextHeightFromTextString:(NSString *)text width:(CGFloat)textWidth fontSize:(CGFloat)size { if ([self heperGetCurrentIOS] >= 7.0) { //iOS7之后 /* 第一个参数: 预设空间 宽度固定  高度预设 一个最大值 第二个参数: 行间距 如果超出范围是否截断 第三个参数: 属

对指定日期计算出N天后的日期问题

指定日期计算出N天后的日期问题 问题描述:先输入起始日期,再输入任意天数n,求n天后的日期. 源代码一(参考http://zhidao.baidu.com/linkurl=0BxF0QvTywzuRkLUFj6ulUQKYqp97CjUOZBV1UUmXoCkS9HNyOT2axHkcOsRLi-xlB_JE6KvdglSD23S35EUXK) #include<stdio.h> <span style="font-family:SimHei;font-size:14px;&q

js操作IE浏览器弹出浏览文件夹

如图所示: 可以返回目录路径. 操作如下: function BrowseFolder(){ try{ var Message = "请选择文件夹"; //选择框提示信息 var Shell = new ActiveXObject( "Shell.Application" ); var Folder = Shell.BrowseForFolder(0,Message,0x0040,0x11);//起始目录为:我的电脑 //var Folder = Shell.Bro

js本身实现的弹出框

一:js现有的弹出框 1.alert(message) message为要在弹出框内显示的纯文本: <html> <script> function show_alert() { alert('hello'); } </script> <body> <tr><td><input type=button id=btn1 name=btn1 value=alert onclick=show_alert();></td&g