2011-09-05 58 views
6

¿Cómo se puede generar un rango de direcciones IP desde una dirección IP inicial y final?¿Cómo puedo obtener un rango de direcciones IP dado el inicio y el final de la dirección IP?

Ejemplo de una red "192.168.0.0/24":

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

quiero tener:

192.168.0.2 
192.168.0.3 
192.168.0.4 
192.168.0.5 
... 
192.168.0.254 

PS: Red, inicio y final de IP puede ser dinámica anterior es sólo una ejemplo.

Gracias ...

+2

Debe conocer la subred para poder hacerlo. –

+0

@OMG Ponies: acabo de agregar la información. – Vishal

+0

¿Cómo quieres las direcciones resultantes? ¿Desea imprimirlos o desea almacenarlos en algún tipo de estructura de datos? – jswolf19

Respuesta

10

Reconocer que cada uno de los 4 componentes de una dirección IPv4 es realmente un número hexadecimal entre 00 y FF.

Si cambia sus direcciones IP de inicio y final en enteros sin signo de 32 bits, puede simplemente pasar de la más baja a la más alta y convertir cada valor que vuelva al formato de la dirección IP.

El rango en el ejemplo que da es de C0A80002 a C0A800FE.

Aquí hay un enlace al código que convierte entre un número hexadecimal y una dirección IPv4

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

+0

Sí, eso es mejor :) Recuerde considerar IPv6. –

+0

@Ryan: Sí, por eso soy explícito sobre v4 en mi respuesta :-) IPv6 es de 128 bits, detalles aquí http://en.wikipedia.org/wiki/IPv6#Larger_address_space –

2

inicio a los 2, contar hasta 254, y poner una "192.168.0." frente a ella:

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

Eso no es muy genérico. OP no especifica que solo será necesario aumentar el componente inferior, ya sea ... – jswolf19

+0

@Ryan: funciona para su ejemplo específico, pero ¿y si el rango excediera 1 byte? –

+0

@ jswolf19: En realidad OP acaba de enmendar la pregunta para especificar que, de hecho, solo el byte bajo necesita ser incrementado :-), pero estoy de acuerdo en que esta respuesta no es muy genérica. –

3

Aquí es la aplicación simple que da salida a lo que pidieron:

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

en cuenta que esto única trabajo para los rangos que implican la última parte de la dirección IP.

+0

¿Puedes explicar la expresión regular '" (? <= \\.) (?!. * \\.) "'? – Labeo

+2

@Labeo '" (? <= \\.) "' Es una mirada hacia atrás que afirma que la entrada anterior char es un punto. '" (?!. * \\.) "' es una mirada negativa que afirma que la siguiente entrada no coincide con ningún número de caracteres, sino con un punto. '" (? <= \\.) (?!. * \\.) "' todo junto significa "coincide justo después de un punto (entre caracteres) cuando el resto de la entrada * no * contiene un punto", que en el habla normal es "justo después del último 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); 
} 
} 
Cuestiones relacionadas