出于测试目的,我尝试创建一个这样的数组:
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}
这是如何运作的?
答案 0 :(得分:8)
我怀疑这是因为Java字节是有符号的,所以你的范围在-128到127之间。所以所有值> 127(0x80)都必须显式转换。
答案 1 :(得分:4)
没有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
。
答案 2 :(得分:2)
-128
到127
之间的整数字面值会自动转换为目标类型,Java
只有签名类型。