我实际上正在执行此操作,但是它非常丑陋,并且让我彻夜难眠,试图拿出一段雄辩的代码来完成它。

我需要采用一系列代表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)

我的睡眠时间表将使您能解决任何雄辩的解决方案。 :

最佳答案

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忽略它们。

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

10-05 20:46