2012-02-03 214 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