2012-02-03 23 views
6

Uso Java (con framework Spring) e desidero convertire tra rappresentazioni numeriche di indirizzi IPv4 (ad esempio 2130706433) e le loro controparti testuali (ad esempio 127.0.0.1). Spesso, i metodi per farlo sono forniti in linguaggi di programmazione (di solito sono chiamati rispettivamente INET_NTOA e INET_ATON) ma non riesco a trovarlo in Java.INET_NTOA e INET_ATON in Java?

Qualcuno sa come vengono chiamati o come implementarli?

risposta

4

Guarda InetAddress nelle javadocs. Queste funzioni non sono direttamente supportate dall'API standard, ma puoi estrarre entrambe le rappresentazioni utilizzando questa classe. Un piccolo esempio:

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

(Tenete a mente che i byte sono firmati.)


Se avete a lungo s di yo può utilizzare ByteBuffer, per coversion veloce e confortevole. Metodi: putLong() then array().

+0

Grazie, sembra un modo fruttuoso per esplorare.Sembra che non ci siano metodi che facciano ciò che voglio subito. – Gruber

3

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

Non esattamente uguale a inet_ntoa, ma molto simile a.

Esempio con lunga discussione:

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

Grazie. Sarebbe bello avere una funzione che richiede un argomento 'long' come argomento. – Gruber

+0

È possibile utilizzare [ByteBuffer] (http://docs.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html). Metodi: putLong() then array() – zeller

2

Ecco cosa io ho scritto per ottenere una rappresentazione numerica di un indirizzo IPv4 testuale:

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

Naturalmente, questo presuppone l'indirizzo IPv4 è dato in un formato valido.

0

Utilizzando the IPAddress Java library è semplice, una riga di codice per ogni senso funziona sia per IPv4 e IPv6. In effetti, puoi scrivere codice che funziona sia per IPv4 che per IPv6 come nel primo esempio qui sotto. Disclaimer: Sono il project manager di quella libreria.

IP-versione agnostic utilizzando byte [] e/o BigInteger:

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

Utilizzare interi per 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); 

Usa BigInteger per IPv6:

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

uscita:

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

    2130706433 
    127.0.0.1 

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