Java中的字节填充

Java中的字节填充,java,bytebuffer,Java,Bytebuffer,我正在开发一个Java程序,其中我需要将short转换为两个字节(然后将其打包成数据包)。我正在使用一个ByteBuffer来执行转换,它似乎可以工作,但我看到一些明显的字节填充,我不太理解 下面是我写的一个简单的例子: import java.lang.*; import java.io.*; import java.nio.ByteOrder; import java.nio.ByteBuffer; public class Test { public static void ma

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

下面是我写的一个简单的例子:

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);
    }
}
字节缓冲
转换为
字节
数组时,为什么第二个字节用0xFF填充?看起来数组的第二个元素应该是
0x87
,而不是
0xffff87
。我错过什么了吗

谢谢

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

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

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

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

试试这个:

for (int j = 0; j < a.length; j++)
   System.out.printf("a[" + j + "] = 0x%H\n", ((int) a[j]) & 0xFF);
for(int j=0;j
&0xFF
操作将剪切转换为int后创建的最高三个字节

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

试试这个:

for (int j = 0; j < a.length; j++)
   System.out.printf("a[" + j + "] = 0x%H\n", ((int) a[j]) & 0xFF);
for(int j=0;j
&0xFF
操作将剪切转换为int后创建的最高三个字节


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

字节
0x87
是负数,设置了高位。转换为int另一个get 0xFFFFFF87,一个负数。字节
0x87
为负数,设置了高位。转换成整数另一个得到0xFFFF87,一个负数。谢谢你把我的困惑浓缩成一个更简洁的问题,谢谢你的回答。这完全有道理。我从来没有想到问题出在
printf()
转换中。当我的测试失败时,至少有50%的时间是由于测试出了问题。感谢您将我的困惑浓缩为一个更简洁的问题,并感谢您的回答。这完全有道理。我从来没有想到问题出现在
printf()
转换中。当我的测试失败时,至少有50%的时间是由于测试出错。谢谢你的建议。我试过了,这确实使输出更加清晰。谢谢你的建议。我试过了,这确实使输出更加清晰。