使用arraycopy错误的结果

时间:2017-05-15 14:00:35

标签: java arrays

我正在尝试将两个字节数组复制到另一个字节数组中。问题是结果字节的第一个元素很奇怪,我得到 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 ??

3 个答案:

答案 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

其余为零。 (默认初始原始值)