Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java guava-InetAddress.ImpresseToInteger返回int而不是long_Java_Guava_Inetaddress - Fatal编程技术网

Java guava-InetAddress.ImpresseToInteger返回int而不是long

Java guava-InetAddress.ImpresseToInteger返回int而不是long,java,guava,inetaddress,Java,Guava,Inetaddress,我对番石榴的方法有个问题 根据该方法: 公共静态int强制整数(InetAddress ip) '返回表示IPv4地址的整数,无论提供的参数是否为IPv4地址。' 但是,IPv4范围是无符号的32位,而Java的int是有符号的,这意味着返回值只能覆盖IPv4相关范围的一半 我是否错过了某个人,或者方法中存在真正的问题 谢谢32位值是32位值,它可以有2^32个值,无论是有符号的还是无符号的。如果您的地址是192.168.0.1,那么它将是一个负数,不会丢失任何信息。如果将其转换为字节(也有符号

我对番石榴的方法有个问题

根据该方法:

公共静态int强制整数(InetAddress ip)

'返回表示IPv4地址的整数,无论提供的参数是否为IPv4地址。'

但是,IPv4范围是无符号的32位,而Java的int是有符号的,这意味着返回值只能覆盖IPv4相关范围的一半

我是否错过了某个人,或者方法中存在真正的问题


谢谢

32位值是32位值,它可以有2^32个值,无论是有符号的还是无符号的。如果您的地址是192.168.0.1,那么它将是一个负数,不会丢失任何信息。如果将其转换为字节(也有符号),则不会丢失任何信息

顺便说一句:对于IPv4地址,您可以使用此技巧

int address = ip.hashCode();
要将32位有符号值视为32位无符号值,可以

int address32 = ...
long address = address32 & 0xFFFFFFFFL;

但是,在大多数情况下不需要这样做。

我认为Javadoc包含了以下答案:

IPv6地址在转换为之前被强制为IPv4地址 整数

只要有应用程序假定所有IP地址 是IPv4地址,因此可以安全地转换为整数 (无论出于何种目的)此函数可用于处理IPv6 地址,直到应用程序被适当地固定

注意:强制为IPv4地址的IPv6地址只能用于 初步识别或索引到一个文件的目的 真实地址的集合。它们不能被当作真的 用于网络通信的地址


换句话说,如果您提供一个IPv6地址,不要期望它是一个实际的、可用的地址。准备好处理代码或网络中带有特殊条件的强制地址。在我看来,文档可以从一个示例中受益匪浅

在Java中,long是64位的值,IPv4地址只是32位的值。挑战在于Java没有无符号数据类型,因此需要一些技巧来读取无符号值,通常是通过向上转换为长数据类型。番石榴也涵盖了这一点:

InetAddress addr = InetAddress.getLocalHost();
long ip = UnsignedInts.toLong (InetAddresses.coerceToInteger (addr));

谢谢你,彼得。明白了。我想我会在java代码中将它用作int,在插入DB之前(作为无符号int),我会使用十六进制值的技巧。但是我不理解你关于IPv4哈希代码的观点。您能详细解释一下吗?此数据结构在内部将地址存储为一个
int
,当您请求hashCode()时,它正好给您这个值。我更希望有一个像
getAddress()
这样的方法,它被定义来获取这个值,但在这种情况下它正好工作。但是,正如它所说,这并不能保证。这就是为什么一种做同样事情但得到保证的方法会更好的原因。