我使用Java(与Spring框架)并且想要在IPv4地址的数字表示(例如2130706433)和它们的文本对应物(例如127.0.0.1
)之间进行转换。通常,用编程语言提供的方法(通常分别称为INET_NTOA
和INET_ATON
),但我无法在Java中找到它。Java中的INET_NTOA和INET_ATON?
有人知道他们叫什么或如何实现它们?
我使用Java(与Spring框架)并且想要在IPv4地址的数字表示(例如2130706433)和它们的文本对应物(例如127.0.0.1
)之间进行转换。通常,用编程语言提供的方法(通常分别称为INET_NTOA
和INET_ATON
),但我无法在Java中找到它。Java中的INET_NTOA和INET_ATON?
有人知道他们叫什么或如何实现它们?
中只看的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()。
我猜InetAddress会做你想要
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;
}
}
这就是我写我自己得到一个文本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地址上的有效形式给出。
番石榴的InetAddresses将做的伎俩。
使用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
谢谢,似乎是一个富有成效的探索方式。似乎没有办法做到我想要的东西。 – Gruber 2012-02-03 13:53:15