2012-02-03 63 views
6

我使用Java(與Spring框架)並且想要在IPv4地址的數字表示(例如2130706433)和它們的文本對應物(例如127.0.0.1)之間進行轉換。通常,用編程語言提供的方法(通常分別稱爲INET_NTOAINET_ATON),但我無法在Java中找到它。Java中的INET_NTOA和INET_ATON?

有人知道他們叫什麼或如何實現它們?

回答

4

中只看的javadoc InetAddress。這些功能不是直接由標準API支持,但可以使用此類提取兩個表示。 一個小例子:

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

(請記住,字節簽名。)


如果你有長-S比喲可以使用ByteBuffer,快速,舒適的丁文。方法:putLong()然後是array()。

+0

謝謝,似乎是一個富有成效的探索方式。似乎沒有辦法做到我想要的東西。 – Gruber 2012-02-03 13:53:15

3

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

不完全一樣INET_NTOA,但非常相似的東西。

實施例具有長參數:

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

謝謝。如果有一個函數需要一個「長」作爲參數,那將是很好的。 – Gruber 2012-02-03 13:50:20

+0

您可以使用[ByteBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html)。方法:putlong()然後array() – zeller 2012-02-03 13:58:28

2

這就是我寫我自己得到一個文本IPv4地址的數字表示:

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

。當然,這是假設的IPv4地址上的有效形式給出。

0

使用the IPAddress Java library這是簡單,每個方向一行代碼同時適用於IPv4和IPv6。實際上,您可以編寫適用於IPv4和IPv6的代碼,如下面的第一個示例所示。 免責聲明:我是該圖書館的項目經理。

IP版本無關的使用字節[]和/或的BigInteger:

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

對於IPv4使用INT:

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

使用的BigInteger對於IPv6:

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

輸出:

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

    2130706433 
    127.0.0.1 

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