2011-09-05 141 views
6

如何從開始和結束IP地址生成一系列IP地址?如何獲得給定開始和結束IP地址的IP地址範圍?

實施例用於在網絡 「192.168.0.0/24」:

String start = "192.168.0.2" 
String end = "192.168.0.254" 

我想有:

192.168.0.2 
192.168.0.3 
192.168.0.4 
192.168.0.5 
... 
192.168.0.254 

PS:網絡,開始和結束的IP可以在上面是動態的僅僅是一個例。

謝謝...

+2

你必須知道子網才能做到這一點。 –

+0

@OMG小馬:我剛剛添加了信息。 – Vishal

+0

你想如何得到結果地址?你只是想打印出來,還是要將它們存儲在某種數據結構中? – jswolf19

回答

10

認識到每個IPv4地址的4個組成部分是真正的00和FF之間的十六進制數。

如果將開始和結束IP地址更改爲32位無符號整數,則可以從最低一位循環到最高位,然後將每個循環的值轉換回IP地址格式。

您給出的示例中的範圍是C0A80002至C0A800FE。

下面是代碼的鏈接是一個十六進制數和IPv4地址

http://technojeeves.com/joomla/index.php/free/58-convert-ip-address-to-number

+0

是的,這是更好的:)記得考慮IPv6。 –

+0

@Ryan:是的,這就是爲什麼我在我的答案中明確了v4 :-) IPv6是128位,詳情在這裏http://en.wikipedia.org/wiki/IPv6#Larger_address_space –

2

開始於2之間轉換,數到254,並把「192.168.0。」在它的前面:

for (int i = 2; i <= 254; i++) { 
    System.out.println("192.168.0." + i); 
} 
+1

這不是非常通用的。 OP沒有指定只有下面的組件需要增加,要麼...... – jswolf19

+0

@Ryan:適用於他的具體示例,但如果範圍超過1個字節會怎麼樣? –

+0

@ jswolf19:其實OP只是修改了這個問題,指出實際上只有低字節需要遞增:-),但我同意這個答案不是非常通用的。 –

3

下面是簡單的實施方案的輸出,你問什麼:

public static void main(String args[]) { 
    String start = "192.168.0.2"; 
    String end = "192.168.0.254"; 

    String[] startParts = start.split("(?<=\\.)(?!.*\\.)"); 
    String[] endParts = end.split("(?<=\\.)(?!.*\\.)"); 

    int first = Integer.parseInt(startParts[1]); 
    int last = Integer.parseInt(endParts[1]); 

    for (int i = first; i <= last; i++) { 
     System.out.println(startParts[0] + i); 
    } 
} 

請注意,這涉及IP地址的最後部分範圍內的工作。

+0

你能解釋一下正則表達式嗎?(?<= \\。)(?!。* \\。)「'? – Labeo

+2

@Labeo'「(?<= \\。)」'是一個隱藏後面的聲明前面的輸入char是一個點。 '「(?!。* \\。)」'是一個反面向前看,斷言以下輸入不匹配任何數量的字符,然後點。 '「(?<= \\。)(?!。* \\。)「'all all means」的意思是在一個點之後(字符之間)匹配,當其餘的輸入不*包含一個點「,在正常的語音中」剛剛在最後一個點之後「。 – Bohemian

1
void main(String args[]) 
{ 
String start = "192.168.0.2"; 
String end = "192.168.0.254"; 

String[] startParts = start.split("(?<=\\.)(?!.*\\.)"); 
String[] endParts = end.split("(?<=\\.)(?!.*\\.)"); 

int first = Integer.parseInt(startParts[1]); 
int last = Integer.parseInt(endParts[1]); 

for (int i = first; i <= last; i++) 
{ 
System.out.println(startParts[0] + i); 
} 
}