Java 为什么ip地址值为且为int 255
我有一个简单的程序来找到我的IP地址并将其转换成字符串。 为什么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
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开始