如果你写过套接字编程等通信类的代码,你应该对这个问题不太了解。
结论先说byte 0xff 是将byte从(-128 至 127)转化成 int(转化后的数值范围: 0 至 255)。
其实就是1个byte有两种表示方法,我们既可以用-128 - 127这段范围来表示一个字节,也可以用 0 - 255这个范围的数来表示一个字节。
请看demo使用Java的inet地址类获取我的当前ip
publicclassinetaddresstest { publicstaticvoidmain [ ] args } throwsunknownhostexception { inetaddresslocalhost=inet } byte [ for (byteb :地址) system.out.print(b ' ); }}输出结果
-64 -88 2 119本机ip
好像不是,我们的ip地址用0 - 255表示,不会出现负数。
所以用别的写法,把取出的字节0xff
publicclassinetaddresstest { publicstaticvoidmain [ ] args } throwsunknownhostexception { inetaddresslocalhost=inet } byte [ for (byteb :地址) system.out.print ) ) ) b0xff ) '); }}结果
1921682119 processfinishedwithexitcode 0还是我们想要的结果
为什么需要转换,是因为Java的byte是有符号的,他的范围只有-128 - 127。
我们使用tcp等协议时,首先将传输的消息转换为字节流,然后再传输。 在编程语言中,用字节流通中常用的十进制字节数组表示。
如果我们用0-255表示一个字节,而不想用负数,该怎么办?
很遗憾,Java没有无符号字节。 要存储0-255,只能使用int。
另一方面,int的范围为(-2^31 )2^31-1 ),仅使用了256个。 剩下的空间都浪费了,得不偿失啊。
所以,我们保存的时候,传输的时候可以使用byte,但是使用的时候需要进行转换。 那么,为什么0xff可以得到无符号字节呢?
0xff的作用为十六进制,0xff在Java中以什么类型存储呢?
很明显吧。0xff是整数。
假设我现在要转换字节-1
-1的原码、反码、补码分别如下。
原码1000001反码0111110补码1111 11111当前运算为0xff。 虽然ff是(1111 11111 ),但0xff前面有24个0,因为他在整数类型中占4个字节,而32是。
用-1的补数计算
- 1011110 xff 000000000000000000000111=00000000000000000000000000000000001111=255实际上,在Java中,“哪个数量0xff就是那个数量本身
“任意整数0xff=本身”没有问题
但是字节0xff被另一个维度拖着,从字节进化到了int。