2012-05-02 76 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

相關問題