将IP地址拆分为八位字节,然后对每个八位字节进行一些数学运算

时间:2012-05-02 16:32:04

标签: javascript

我实际上有这个工作,但它非常难看,它让我在晚上保持清醒,试图想出一个雄辩的代码来完成它。

我需要使用一系列代表IP范围的字符串,并确定字符串代表的实际IP地址数。我的方法是将其分成4个八位字节,然后尝试拆分每个八位字节并从那里进行数学计算。

例如:1.2.3.4-6代表1.2.3.4,1.2.3.5和1.2.3.6,因此我想从这个范围得到3的答案。

为了进一步复杂化,我开始使用的字符串可以是文本框中的这些范围的列表,由换行符分隔,因此我需要单独查看每一行,获取所表示的IP地址的计数,以及最后,有多少提交的范围具有这种条件。

1.1.1.4-6     /* Represents 3 actual IP Addresses, need to know "3" */
2.2.3-10.255  /* Represents 8 actual IP Addresses, need to   know "8" */
3.3.3.3       /* No ranges specified, skip this
4.4.4.4       /* No ranges specified, skip this

净结果是我想知道的是2行包含一个“范围”,它代表8个IP地址(3 + 8)

任何雄辩的解决方案都会受到我的睡眠时间表的赏识。 : )

2 个答案:

答案 0 :(得分:2)

There you go:

var ips = ["1.2.3.4", "2.3.4-6.7", "1.2.3.4-12"];
for(var i=0; i<ips.length; i++) {
    var num = 1;
    var ip = ips[i];
    var parts = ip.split('.');
    for(var j=0; j<parts.length; j++) {
        var part = parts[j];
        if(/-/.test(part)) {
            var range = part.split('-');
            num *= parseInt(range[1]) - parseInt(range[0]) + 1;
        }
    }
    alert(ip + " has " + num + " ips.");
}​

此代码也正确处理1.2.3-4.0-255之类的范围(即该范围内256 * 2 = 512 ips)。没有范围的列表项总共产生1个ips,如果不需要,可以根据生成的num忽略它们。

你可能需要略微修改我的例子,但我相信你这样做不会有任何麻烦。

答案 1 :(得分:2)

好的,我就是这样做的

var addr = '1.1.3-10.4-6';

function getNumAddresses(input) {
    var chunks = input.split('.');
    var result = 1;

    for (var i = 0; i < 4; i++) {
        if (chunks[i].indexOf('-') != -1) {
            var range = chunks[i].split('-');
            result *= parseInt(range[1]) -  parseInt(range[0]) + 1;
        }
    }

    return result;
}

alert(getNumAddresses(addr));