2012-05-02 46 views
1

我确实有这个工作,但它非常丑陋,并且它在晚上让我保持清醒,试图拿出一段雄辩的代码来完成它。将IP地址分割成八位字节,然后对每个八位字节做一些数学计算

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

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

不限口才解决方案将由我的睡眠时间表所理解的。 : )

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

您可能需要稍微修改我的示例,但我相信您在此过程中不会遇到任何问题。

+0

看起来很完美,非常感谢你! – GDP

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)); 
+0

+1以获得最佳答案,但不会返回IP范围列表中出现多少次以检查 – GDP

相关问题