什么时候需要将Java中的十六进制字面值转换为(byte) ?



出于测试目的,我尝试创建一个这样的数组:

byte[] expected = new byte[]{0x2f, 0x0d4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc}

我预料到,java会抱怨并要求我将这里的每个字面值转换为(byte),但出乎意料的是,它只要求我转换0x4d,而不是0x2f。工作示例:

new byte[]{0x2f, (byte) 0xd4, (byte) 0xe1, (byte) 0xc6, 0x7a, 0x2d, 0x28, (byte) 0xfc}

这是如何工作的?

我怀疑这是因为Java字节是有符号的,因此您有一个介于-128和127之间的范围。因此,所有>127 (0x80)的值都必须显式转换。

没有l, df的数字字面值是int值,因此必须强制转换0x80及更大的值。覆盖大量十六进制值的一种方法是使用以下

byte[] bytes = new BigInteger("2fd4e1c67a2d28fc", 16).toByteArray();
System.out.println(Arrays.toString(bytes));

打印

[47, -44, -31, -58, 122, 45, 40, -4]

这避免了一些冗长的值之间的, (byte) 0x

-128127之间的整型文字将自动转换为目标类型,Java只有signed类型

最新更新