我使用Java(使用Spring框架)并希望在IPv4地址的数字表示(例如2130706433)和它们的文本对应物(例如127.0.0.1
)之间进行转换。通常,这样做的方法是用编程语言提供的(它们通常分别称为INET_NTOA
和INET_ATON
),但我在Java中找不到它。
有人知道他们被称为什么或如何实施它们?
答案 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可以解决问题。
中查看Ido的评论