如何在Java中定义包含全范围十六进制值的字节数组?
在Java中定义包含全范围十六进制值的字节数组
Java里的byte是有符号8位整数,范围是-128到127,而像0xff(对应十进制255)、0xf2(242)这类值超出了有符号byte的正范围上限,直接写会触发“可能丢失精度”的编译错误——因为字面量0xff在Java里默认是int类型(32位),无法自动转成byte。
而Go的byte本质是uint8(无符号8位整数),范围0到255,所以可以直接用0xff这类值定义数组,两者的字节存储逻辑不同导致了这个差异。
解决方法很简单,只需要对超出范围的十六进制值做强制类型转换,告诉编译器你明确要截断高位,把int转成byte:
// 正确定义包含0xff、0xf2的字节数组 byte[] options = { (byte)0xff, (byte)0xf2, 0x01, 0x00 };
关于无符号值的读取
虽然Java的byte是有符号的,但二进制存储和无符号byte是一样的。如果需要把这些byte当成无符号值(比如对应0-255的十进制数)使用,可以通过以下方式转换:
- 用
Byte.toUnsignedInt()方法:byte b = (byte)0xff; int unsignedValue = Byte.toUnsignedInt(b); // 得到255 - 或者手动和
0xff做按位与运算(本质是把byte转成int时保留低8位的无符号值):int unsignedValue = b & 0xff; // 同样得到255
这样既可以正确定义包含全范围十六进制值的字节数组,也能在需要时获取对应的无符号十进制数值。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

