我有一个关于Guava的InetAddress.coerceToInteger方法的问题。
根据文档,该方法为:
public static int coerceToInteger(InetAddress ip)
“返回表示IPv4地址的整数,而不管提供的参数是否为IPv4地址。”
但是,IPv4范围是无符号32位,而Java的int是有符号的 - 这意味着返回值只能覆盖IPv4相关范围的一半。
我是否错过了什么,还是该方法存在真正的问题?
谢谢
我有一个关于Guava的InetAddress.coerceToInteger方法的问题。
根据文档,该方法为:
public static int coerceToInteger(InetAddress ip)
“返回表示IPv4地址的整数,而不管提供的参数是否为IPv4地址。”
但是,IPv4范围是无符号32位,而Java的int是有符号的 - 这意味着返回值只能覆盖IPv4相关范围的一半。
我是否错过了什么,还是该方法存在真正的问题?
谢谢
一个32位的值就是一个32位的值,无论它是带符号还是无符号,它都可以有2^32个取值。如果你有一个像192.168.0.1这样的地址,它会成为一个负数,但没有信息丢失。如果你将它转换成字节(也带符号),也不会损失任何信息。
顺便说一句:对于IPv4地址,你可以使用这个技巧。
int address = ip.hashCode();
int address32 = ...
long address = address32 & 0xFFFFFFFFL;
InetAddress addr = InetAddress.getLocalHost();
long ip = UnsignedInts.toLong (InetAddresses.coerceToInteger (addr));
int
,当你请求hashCode()时,它恰好会返回这个值。我更喜欢有一个类似getAddress()
的方法来获取该值,但在这种情况下它也可以正常工作。 - Peter Lawrey