Java中的INET_NTOA和INET_ATON?

时间:2012-02-03 13:27:40

标签: java ip-address

我使用Java(使用Spring框架)并希望在IPv4地址的数字表示(例如2130706433)和它们的文本对应物(例如127.0.0.1)之间进行转换。通常,这样做的方法是用编程语言提供的(它们通常分别称为INET_NTOAINET_ATON),但我在Java中找不到它。

有人知道他们被称为什么或如何实施它们?

6 个答案:

答案 0 :(得分:4)

查看javadoc中的InetAddress。标准API不直接支持这些函数,但您可以使用此类提取这两个表示。 一个小例子:

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

(请记住,字节已签名。)


如果你有长期比你可以使用ByteBuffer,快速和舒适的转换。方法:putLong()然后是array()。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:2)

我想InetAddress会做你想做的事情

答案 3 :(得分: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地址是以有效格式提供的。

答案 4 :(得分:2)

使用the IPAddress Java library很简单,每个方向的一行代码适用于IPv4和IPv6。实际上,您可以编写适用于IPv4和IPv6的代码,如下面的第一个示例所示。 免责声明:我是该图书馆的项目经理。

使用byte []和/或BigInteger进行IP版本无关:

//for ScrollViewer s;
s.ScrollToHorizontalOffset((s.ExtentWidth - s.ViewportWidth) / 2);
s.ScrollToVerticalOffset((s.ExtentHeight - s.ViewportHeight) / 2);

使用IPv4的整数:

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

使用BigInteger for IPv6:

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

输出:

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

答案 5 :(得分:0)

Guava的InetAddresses可以解决问题。

Going from 127.0.0.1 to 2130706433, and back again

中查看Ido的评论