java中的Mixed Integer和String bytebuffer

时间:2014-11-17 20:12:41

标签: java byte bytebuffer

我在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行为吗?

2 个答案:

答案 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非常有帮助。