我正在尝试将两个字节数组复制到另一个字节数组中。问题是结果字节的第一个元素很奇怪,我得到 0xFFFFFF80 而不是 0x80 。 我正在使用的代码是:
this.IC_SUBMIT_APDU = new byte[13];
byte[] prefix = {
(byte) 0x80,
(byte) 0x20,
(byte) 0x07,
(byte) 0x00,
(byte) 0x08
};
System.arraycopy(prefix , 0, this.IC_SUBMIT_APDU, 0, prefix.length);
for(int i=0; i<this.IC_SUBMIT_APDU.length ; i++)
System.out.println("" + Integer.toHexString(this.IC_SUBMIT_APDU[i]));
当我给出这个论点时:
{
(byte) 0x41,
(byte) 0x43,
(byte) 0x4F,
(byte) 0x53,
(byte) 0x54,
(byte) 0x45,
(byte) 0x53,
(byte) 0x54
}
它产生以下结果:
ffffff80
20
7
0
8
0
0
0
0
0
0
0
0
为什么我会得到 0xFFFFFF80 ?我不应该得到 0x80 ??
答案 0 :(得分:3)
0xFFFFFF80超过一个字节。 0xFFFFFF部分可能来自您未显示的其他print语句。
答案 1 :(得分:2)
与System.arrayCopy
无关。
事实上,System.out.println(Integer.toHexString((byte) 0x80));
也会打印ffffff80
。
将十六进制0x80
作为字节进行转换时会出现算术溢出,因为其十进制值为128
,即1
超过byte
的容量({{1} }}或Byte.MAX_VALUE
)并溢出到127
。
请注意,-128
依次返回无符号整数的表示形式,因此会产生额外的溢出。
答案 2 :(得分:0)
您正在正确复制 ic_submit_apdu_prefix 中仅存在的5个元素......
提示:8位的0x80是-128(2补码)
0xffffff80 = -128
0x20 = 32
7
0
8
0
其余为零。 (默认初始原始值)