我使用Java(使用Spring框架),并希望在IPv4地址的数字表示(例如2130706433)和它们的文本对应物(例如127.0.0.1)。通常,在编程语言中提供了这样做的方法(它们通常分别称为INET_NTOA和INET_ATON),但我在Java中找不到它。有人知道它们叫什么或者如何实现吗?
127.0.0.1
INET_NTOA
INET_ATON
ybzsozfc1#
查看javadoc中的InetAddress。标准API不直接支持这些函数,但您可以使用此类提取这两种表示。举个小例子:
InetAddress address = InetAddress.getLocalHost(); byte[] byteAddress = address.getAddress(); System.out.println(Arrays.toString(byteAddress)); System.out.println(address.getHostAddress());
(Keep注意字节是有符号的。)如果你有比你长的-s,可以使用ByteBuffer,快速而舒适的转换。方法:putLong()然后array()。
r55awzrz2#
下面是我自己编写的代码,以获得文本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地址是以有效格式给出的。
3mpgtkmj3#
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; } }
xn1cxnb44#
使用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使用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);
对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
nxowjjhe5#
我猜InetAddress会做你想做的事情
8yoxcaq76#
Guava的InetAddresses就可以做到这一点。查看Going from 127.0.0.1 to 2130706433, and back again中Ido的评论
9q78igpj7#
请尝试以下代码。
import java.net.InetAddress; import java.net.UnknownHostException; public class IpConvertUtil { public static long inetAton(String ipAddress) throws UnknownHostException { InetAddress address = InetAddress.getByName(ipAddress); byte[] bytes = address.getAddress(); long result = 0; for (byte b : bytes) { result = result << 8 | (b & 0xFF); } return result; } public static String inetNtoa(long address) { return (address >> 24 & 0xFF) + "." + (address >> 16 & 0xFF) + "." + (address >> 8 & 0xFF) + "." + (address & 0xFF); } }
7条答案
按热度按时间ybzsozfc1#
查看javadoc中的InetAddress。标准API不直接支持这些函数,但您可以使用此类提取这两种表示。举个小例子:
(Keep注意字节是有符号的。)
如果你有比你长的-s,可以使用ByteBuffer,快速而舒适的转换。方法:putLong()然后array()。
r55awzrz2#
下面是我自己编写的代码,以获得文本IPv4地址的数字表示:
当然,这假设IPv4地址是以有效格式给出的。
3mpgtkmj3#
java.net.InetAddress.getByAddress(byte[])
与INET_NTOA不完全相同,但与非常相似。
长参数示例:
xn1cxnb44#
使用the IPAddress Java library很简单,每个方向的一行代码适用于IPv4和IPv6。事实上,您可以编写适用于IPv4和IPv6的代码,如下面的第一个示例所示。免责声明:我是那个图书馆的项目经理。
使用byte[]和/或BigInteger的IP版本不可知:
对IPv4使用int:
对IPv6使用BigInteger:
输出:
nxowjjhe5#
我猜InetAddress会做你想做的事情
8yoxcaq76#
Guava的InetAddresses就可以做到这一点。
查看Going from 127.0.0.1 to 2130706433, and back again中Ido的评论
9q78igpj7#
请尝试以下代码。