1

我正在开发一个 Java 程序,在该程序中我需要将 a 转换short为两个字节(然后将其打包成一个数据包)。我正在使用 aByteBuffer来执行转换,它似乎可以工作,但我看到一些我不太理解的明显字节填充。

这是我写的一个简单的例子:

import java.lang.*;
import java.io.*;
import java.nio.ByteOrder;
import java.nio.ByteBuffer;

public class Test {
    public static void main(String args[]) {
        short i = 27015;
        String s = Integer.toHexString(i);

        System.out.println( "i = " + i );
        System.out.println( "s = " + s );
        System.out.println( "---" );

        ByteBuffer b = ByteBuffer.allocate(2);
        b.order(ByteOrder.BIG_ENDIAN);
        b.putShort(i);

        System.out.printf("0x%H\n", b.getShort(0));
        System.out.println( "---" );

        byte[] a = b.array();

        for( int j = 0; j < a.length; j++ )
            System.out.printf("a[" + j + "] = 0x%H\n", a[j]);

        System.exit(0);
    }
}

该程序产生以下输出:

i = 27015
s = 6987
---
0x6987
---
a[0] = 0x69
a[1] = 0xFFFFFF87

ByteBuffer转换为byte数组时,为什么第二个字节用0xFF填充?看起来数组的第二个元素应该是0x87而不是0xFFFFFF87. 我错过了什么吗?

谢谢!

4

2 回答 2

1

ByteBuffer转换为字节数组时,为什么第二个字节用0xFF填充?

当您使用%H它打印时,会将字节转换为 int。它不是 ByteBuffer 中具有这么多位的字节,而是它的打印方式。我建议Byte.toHexString(a[j])改用。

于 2013-08-05T15:09:13.453 回答
0

试试这个:

for (int j = 0; j < a.length; j++)
   System.out.printf("a[" + j + "] = 0x%H\n", ((int) a[j]) & 0xFF);

& 0xFF操作将削减转换为 int 后创建的最高三个字节。

仅供参考:((int) a[j]) & 0xFF可以写成a[j] & 0xFF并且将编译完全相同。但我最初是这样写的,以澄清正在发生的事情。

于 2013-08-05T15:12:57.137 回答