2011-09-05 15 views
6

In che modo è possibile generare un intervallo di indirizzi IP da un indirizzo IP iniziale e finale?Come si genera un intervallo di indirizzi IP con indirizzo IP iniziale e finale?

Esempio per una rete "192.168.0.0/24":

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

voglio avere:

192.168.0.2 
192.168.0.3 
192.168.0.4 
192.168.0.5 
... 
192.168.0.254 

PS: Rete, inizio e fine IP può essere dinamico sopra è solo un esempio.

Grazie ...

+2

Per farlo è necessario conoscere la sottorete. –

+0

@OMG Ponies: ho appena aggiunto le informazioni. – Vishal

+0

Come vuoi gli indirizzi risultanti? Vuoi solo stamparli o vuoi memorizzarli in una sorta di struttura dati? – jswolf19

risposta

10

Riconoscere che ognuno dei 4 componenti di un indirizzo IPv4 è in realtà un numero esadecimale compreso tra 00 e FF.

Se si modifica l'indirizzo IP iniziale e quello finale in numeri interi senza segno a 32 bit, è possibile eseguire il ciclo da uno più basso a uno più alto e convertire ogni valore che si ricollega al formato dell'indirizzo IP.

L'intervallo nell'esempio fornito è C0A80002 in C0A800FE.

Ecco un link al codice che converte tra un numero esadecimale e un indirizzo IPv4

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

+0

Sì, è meglio :) Ricordati di considerare IPv6. –

+0

@Ryan: Sì, è per questo che sono esplicito sulla v4 nella mia risposta :-) IPv6 è 128 bit, dettagli qui http://en.wikipedia.org/wiki/IPv6#Larger_address_space –

2

Inizia dai 2, contare fino a 254, e mettere un "192.168.0". di fronte ad essa:

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

Questo non è molto generico. OP non specifica che sarà necessario incrementare solo il componente inferiore, o ... – jswolf19

+0

@Ryan: funziona per il suo esempio specifico, ma cosa succede se l'intervallo supera 1 byte? –

+0

@ jswolf19: In realtà l'OP ha appena modificato la domanda per specificare che in effetti solo il byte basso deve essere incrementato :-), ma sono d'accordo che questa risposta non sia molto generica. –

3

Ecco semplice implementazione che genera quello che hai chiesto:

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); 
    } 
} 

Si noti che questo solo lavoro per gli intervalli che coinvolgono l'ultima parte dell'indirizzo IP.

+0

Puoi spiegare la regex '" (? <= \\.) (?!. * \\.) "'? – Labeo

+2

@Labeo '" (? <= \\.) "' È un look-behind che asserisce che il char di input precedente è un punto. '" (?!. * \\.) "' è uno sguardo negativo che afferma che il seguente input non corrisponde a nessun numero di caratteri e quindi a un punto. '" (? <= \\.) (?!. * \\.) "tutti insieme significa" combaciano solo dopo un punto (tra caratteri) quando il resto dell'input * non * contiene un punto ", che nel parlato normale è" subito dopo l'ultimo punto ". – 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); 
} 
}