我在java中有一个bytebuffer,它是字符串和整数类型的混合,下面是代码,可以更好地了解我的意思。
int ID_SIZE = 8;
int LENGTH_SIZE = 8;
int MESSAGE_SIZE = 30;
char[] id = new char[ID_SIZE];
int length = 12;
String message = "\0";
for(int i = 0;i<MESSAGE_SIZE;i++)
message+="a";
ByteBuffer bbuf = ByteBuffer.allocate(35);
bbuf.putInt(length);
bbuf.put(message.getBytes());
for(int i = 0;i<36;i++)
System.out.println(bbuf.get(i));
结果我得到了
0
0
0
12
0
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
我知道97
是ASCII a
。但是我很好奇为什么在12
0
0
0
之前呢?这是否与混合字节缓冲区有关或者这只是正常的bybbuffer行为吗?
答案 0 :(得分:1)
ByteBuffer.putInt
总是将int作为完整的32位--4个字节。您在长度字段中看到前三个零字节。
答案 1 :(得分:1)
您正在存储32位整数。打印字节缓冲区时看到的每个字节长度为8位;所以它需要四个代表一个32位的值。
请注意,JDK附带的ByteBuffer
的两个实现默认使用big endian,因此您获得00 00 00 12
而不是12 00 00 00
。您可以使用
bbuf.order(ByteOrder.LITTLE_ENDIAN);
如果您愿意,但如果您只是存储和检索,那么只要您使用与存储相同的顺序进行检索,它就不重要。
有关如何将int
转换为字节的详细信息,您可能会发现this article非常有帮助。