2012-02-03 12 views
6

Uso Java (con Spring framework) y quiero convertir representaciones numéricas de direcciones IPv4 (por ejemplo, 2130706433) y sus contrapartes de texto (por ejemplo, 127.0.0.1). A menudo, los métodos para hacerlo se proporcionan en los lenguajes de programación (generalmente se llaman INET_NTOA y INET_ATON respectivamente) pero no puedo encontrarlo en Java.INET_NTOA e INET_ATON en Java?

¿Alguien sabe cómo se llaman o cómo implementarlas?

Respuesta

4

Mira InetAddress en los javadocs. Estas funciones no están respaldadas directamente por la API estándar, pero puede extraer ambas representaciones utilizando esta clase. Un pequeño ejemplo:

InetAddress address = InetAddress.getLocalHost(); 
    byte[] byteAddress = address.getAddress(); 
    System.out.println(Arrays.toString(byteAddress)); 
    System.out.println(address.getHostAddress()); 

(Tenga en cuenta que los bytes están firmados.)


Si tiene largo s que yo puede utilizar ByteBuffer, por coversion rápido y cómodo. Métodos: putLong() luego array().

+0

Gracias, parece una manera fructífera de explorar.Parece que no hay métodos que hagan lo que quiero de inmediato. – Gruber

3

java.net.InetAddress.getByAddress(byte[])

No

exactamente igual que inet_ntoa, pero muy similar al.

Ejemplo con el argumento de largo:

String ntoa(long raw) { 
    byte[] b = new byte[] {(byte)(raw >> 24), (byte)(raw >> 16), (byte)(raw >> 8), (byte)raw}; 
    try { 
     return InetAddress.getByAddress(b).getHostAddress(); 
    } catch (UnknownHostException e) { 
     //No way here 
     return null; 
    } 
} 
+0

Gracias. Sería bueno tener una función que tome un 'largo' como argumento. – Gruber

+0

Puede usar [ByteBuffer] (http://docs.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html). Métodos: putLong() then array() – zeller

2

Esto es lo que yo he escrito para obtener una representación numérica de una dirección IPv4 textual:

public static Long ipAsNumeric(String ipAsString) { 
    String[] segments = ipAsString.split("\\."); 
    return (long) (Long.parseLong(segments[0]) * 16777216L 
     + Long.parseLong(segments[1]) * 65536L 
     + Long.parseLong(segments[2]) * 256L + 
     Long.parseLong(segments[3])); 
} 

Por supuesto, esto supone que la dirección IPv4 se da en un formato válido.

0

Usando the IPAddress Java library es simple, una línea de código para cada sentido funciona tanto para IPv4 e IPv6. De hecho, puede escribir código que funcione tanto para IPv4 como para IPv6 como en el primer ejemplo a continuación. Descargo de responsabilidad: soy el gerente de proyecto de esa biblioteca.

IP versión agnóstica con el byte [] y/o BigInteger:

IPAddress loopback = new IPAddressString("::1").getAddress(); 
    System.out.println(loopback.getValue()); 
    IPAddress backAgain = new IPAddressGenerator().from(loopback.getBytes()); 
    System.out.println(backAgain); 

Use enteros para IPv4:

IPv4Address loopbackv4 = new IPAddressString("127.0.0.1").getAddress().toIPv4(); 
    System.out.println(loopbackv4.intValue()); 
    IPv4Address backAgainv4 = new IPv4Address(loopbackv4.intValue()); 
    System.out.println(backAgainv4); 

Uso BigInteger para IPv6:

IPv6Address loopbackv6 = new IPAddressString("::1").getAddress().toIPv6(); 
    System.out.println(loopbackv6.getValue()); 
    IPv6Address backAgainv6 = new IPv6Address(loopbackv6.getValue()); 
    System.out.println(backAgainv6); 

de salida:

1 
    0:0:0:0:0:0:0:1 

    2130706433 
    127.0.0.1 

    1 
    0:0:0:0:0:0:0:1 
Cuestiones relacionadas