我正在开发一个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);
}
}
该程序产生以下输出:
i = 27015
s = 6987
---
0x6987
---
a[0] = 0x69
a[1] = 0xFFFFFF87
当ByteBuffer
转换为byte
数组时,为什么第二个字节用0xFF填充?看起来数组的第二个元素应该是0x87
而不是0xFFFFFF87
。我错过了什么吗?
谢谢!
答案 0 :(得分:1)
当ByteBuffer转换为字节数组时,为什么第二个字节用0xFF填充?
使用%H
进行打印时,会将字节转换为int。它不是ByteBuffer中具有这么多位的字节,而是它的打印方式。我建议改用Byte.toHexString(a[j])
。
答案 1 :(得分: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
并且编译完全相同。但我最初是这样写的,以澄清正在发生的事情。