Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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 为什么ip地址值为且为int 255_Java_String_Binary_Inetaddress - Fatal编程技术网

Java 为什么ip地址值为且为int 255

Java 为什么ip地址值为且为int 255,java,string,binary,inetaddress,Java,String,Binary,Inetaddress,我有一个简单的程序来找到我的IP地址并将其转换成字符串。 为什么b[i]值下面有(int)255 public class FirstSocketProgramming { public static void main (String arg[]){ InetAddress local = null; try { local = InetAddress.getLocalHost(); } catch (UnknownHostException

我有一个简单的程序来找到我的IP地址并将其转换成字符串。 为什么
b[i]
值下面有
(int)255

public class FirstSocketProgramming {  

 public static void main (String arg[]){  

  InetAddress local = null;  

  try {  

   local = InetAddress.getLocalHost();  

  } catch (UnknownHostException e){  

   System.err.println   

      ("Identity Crisis!");  

   System.exit(0);  

  }  

 byte[] b = local.getAddress();  

System.out.println (b.toString());  
System.out.println (b.length);  
 String strAddress="";  

 for (int i = 0; i < b.length; i++)  

   strAddress += ((int)255&b[i]) + ".";  

 System.out.println ("Local = " + strAddress);  

 }  

}
公共类FirstSocketProgramming{
公共静态void main(字符串arg[]){
InetAddress local=null;
试试{
local=InetAddress.getLocalHost();
}捕获(未知后异常e){
System.err.println
(“身份危机!”);
系统出口(0);
}  
字节[]b=local.getAddress();
System.out.println(b.toString());
System.out.println(b.长度);
字符串“”;
for(int i=0;i
它将有符号字节转换为整数,以便获得(无符号)8位的完整范围,而不是对127以上的值显示负数


在Java中,由于字节是有符号的,所以一个字节的最大值是127。所以我们假设这个数字是128。在无符号字节中,这将表示为1000000B。但是,如果2的补码为负数,则变为-128。执行255&b[i]将值强制为整数(32位),并将高位置零,这样得到的是128而不是-128。

它将有符号字节转换为整数,这样得到的是(无符号)8位的完整范围,而不是对超过127的值显示负数


在Java中,由于字节是有符号的,所以一个字节的最大值是127。所以我们假设这个数字是128。在无符号字节中,这将表示为1000000B。但是,如果2的补码为负数,则变为-128。执行255&b[i]将值强制为整数(32位),并将高位置零,因此得到的是128而不是-128。

该地址被写入一组字节,从0到255。Java将每个字节解释为-128到127之间的有符号字节。因此,从字节中形成一个字符串作为有符号字节是没有意义的,例如
-18.14.87.-45
。这与IP表示不匹配

(int)255&b[i]
b[i]
强制转换为
int
,同时将其加宽,从而忽略符号并将其读取为无符号。
(int)
很无聊,因为
255
已经被解释为大于8位的内容。
0-255
值向下串联。因此,您将获得类似于
192.168.1.200
(请注意,此地址与前面给出的错误地址不匹配)的IP


一般来说,对整数n执行
255&foo
(或任何
2^n-1
,如65536,甚至是十六进制
0xFF
)都是为了安全地强制转换位长度。

地址被写入一组字节,从0到255。Java将每个字节解释为-128到127之间的有符号字节。因此,从字节中形成一个字符串作为有符号字节是没有意义的,例如
-18.14.87.-45
。这与IP表示不匹配

(int)255&b[i]
b[i]
强制转换为
int
,同时将其加宽,从而忽略符号并将其读取为无符号。
(int)
很无聊,因为
255
已经被解释为大于8位的内容。
0-255
值向下串联。因此,您将获得类似于
192.168.1.200
(请注意,此地址与前面给出的错误地址不匹配)的IP


一般来说,对整数n执行
255&foo
(或任何
2^n-1
,如65536,甚至是十六进制
0xFF
)都是为了安全地强制转换位长度。

ip地址是逻辑的,并且使用子网掩码来查找网络id和主机id。在本例中,这是相同的,但非常不寻常。子网掩码可用于划分多个网络id。请阅读此处示例:。

ip地址是逻辑的,使用子网掩码可以查找网络id和主机id。在示例中,它是相同的,但非常不寻常。子网掩码可用于划出许多网络id。请阅读此处示例:。

字节
数据类型基于二进制有符号数表示,其值范围为-128到+127

从0到127的正值的最高有效位等于0,表示
+
。 这里的二进制表示法与其数值相同,例如
byte 00000100=int 4

从-128到-1的负值的最高有效位等于1,表示
-
但是,在负范围内,2的补码二进制表示法与其数值不相同,例如,您可能期望
字节10000100
等于
int 132
,但实际上是
-124
。 简单地将
字节
强制转换为
int
是没有帮助的

强制转换只是将1字节扩展为4字节,
10000100=>111111111100000100
等于-124,而不是132,因为
int
数据类型也基于两个补码。将
byte
转换为
int
是朝着正确方向迈出的一步,但是您还需要先去掉所有这些<代码>255&b[i]技巧实现了这一点

这就是在
255&b[i]
中发生的情况:
根据
中定义的转换规则,按位运算符首先将其操作数转换为int,这意味着
255&b[i]
((int)255)和((int)b[i])
相同。当字节转换为int时,它只会变得更宽:

10000100=字节-124=>1111111 0000100=int-124

然后按位执行AND

11111111111111111111111110000100 = int -124 
&
00000000000000000000000011111111 = int 255
--------------------------------
00000000000000000000000010000100 = int 132

最终结果是一个
int132

字节
数据类型基于二进制有符号数表示,其值范围为-128到+127

从0到127的正值的最高有效位等于0,表示
+
。 这里的二进制表示法与其数值相同,例如
byte 00000100=int 4

负值从-12开始