ByteBuffer put 方法在 ByteArray 之后添加 0

ByteBuffer put method adds 0 after ByteArray

我目前 运行 在 java.nio.bytebuffer 的 put 方法中遇到了一个非常奇怪的问题,我想知道你是否知道答案,所以让我们开始吧。

我的目标是将一些数据连接到字节缓冲区。问题是在我调用 put 方法后它总是在字节数组后添加一个 0。

下面是有这些副作用的方法:

    public ByteBuffer toByteBuffer() {

    ByteBuffer buffer = ByteBuffer.allocateDirect(1024));
    
    buffer.put(type.name().getBytes()); // 0 added here

    data.forEach((key, value) -> {
        buffer.putChar('|');
        buffer.put(key.getBytes()); // 0 added here
        buffer.putChar('=');
        buffer.put(value.getBytes()); // 0 added here
    });

    buffer.flip();

    return buffer;
}

预期输出应如下所示:

ClientData|OAT=14.9926405|FQRIGHT=39.689075|..... 

实际输出,其中 _ 代表 0:

ClientData_|OAT_=14.9926405_|FQRIGHT_=39.689075_|.....

文档没有说明任何有关此副作用的信息。 此外,put 方法只在字节数组之间放置一个 0,而不是在缓冲区的最后。

我认为该方法可能是错误的,或者至少没有正确记录,但我真的不知道为什么会这样。

我认为您可能稍微误解了这里发生的事情。我注意到你关于“但不在缓冲区的最后”的评论。

[=11=] 实际上来自 putChar(char) 调用,而不是 put(byte[]) 调用。正如 the docs 中所说(强调):

Writes two bytes containing the given char value, in the current byte order

默认的字节顺序是big endian;鉴于您正在编写的字符在 7 位 ASCII 范围内,这意味着“您想要的字节”将以 0x00.

开头

如果要写一个字节,使用put(byte):

buffer.put((byte) '|');