出于测试目的,我尝试创建一个这样的数组:
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
, d
或f
的数字字面值是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
。
-128
到127
之间的整型文字将自动转换为目标类型,Java
只有signed类型