1

我实际上有这个工作,但它非常丑陋,它让我夜不能寐,试图想出一段雄辩的代码来完成它。

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

eg: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)

我的睡眠时间表将不胜感激任何雄辩的解决方案。:)

4

2 回答 2

3

你去:

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 个 ip,num如果您不需要它们,您可以根据结果忽略它们。

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

于 2012-05-02T16:42:45.693 回答
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));
于 2012-05-02T16:45:54.633 回答