【发布时间】:2012-02-26 02:45:02
【问题描述】:
我使用 Java(带有 Spring 框架)并希望在 IPv4 地址的数字表示(例如 2130706433)和它们的文本对应物(例如127.0.0.1)之间进行转换。通常,执行此操作的方法以编程语言提供(它们通常分别称为INET_NTOA 和INET_ATON),但我在Java 中找不到。
有人知道它们叫什么或如何实现它们吗?
【问题讨论】:
标签: java ip-address
我使用 Java(带有 Spring 框架)并希望在 IPv4 地址的数字表示(例如 2130706433)和它们的文本对应物(例如127.0.0.1)之间进行转换。通常,执行此操作的方法以编程语言提供(它们通常分别称为INET_NTOA 和INET_ATON),但我在Java 中找不到。
有人知道它们叫什么或如何实现它们吗?
【问题讨论】:
标签: java ip-address
查看 javadocs 中的InetAddress。标准 API 不直接支持这些函数,但您可以使用此类提取这两种表示。 一个小例子:
InetAddress address = InetAddress.getLocalHost();
byte[] byteAddress = address.getAddress();
System.out.println(Arrays.toString(byteAddress));
System.out.println(address.getHostAddress());
(请记住,字节是有符号的。)
如果您有 long-s,则可以使用ByteBuffer,快速舒适地覆盖。方法:putLong() 然后 array()。
【讨论】:
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;
}
}
【讨论】:
long 作为参数的函数会很好。
这是我自己编写的,用于获取文本 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 地址是以有效格式给出的。
【讨论】:
使用the IPAddress Java library 很简单,每个方向的一行代码适用于 IPv4 和 IPv6。事实上,您可以编写适用于 IPv4 和 IPv6 的代码,如下面的第一个示例所示。 免责声明:我是该库的项目经理。
使用 byte[] 和/或 BigInteger 与 IP 版本无关:
IPAddress loopback = new IPAddressString("::1").getAddress();
System.out.println(loopback.getValue());
IPAddress backAgain = new IPAddressGenerator().from(loopback.getBytes());
System.out.println(backAgain);
对 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);
对 IPv6 使用 BigInteger:
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
【讨论】:
我猜InetAddress 会做你想做的事
【讨论】:
Guava 的 InetAddresses 可以解决问题。
【讨论】: