我有以下代码:
byte[] payloadArray = getPayload();
int size = (HEADER_SIZE+payloadArray.length);
ByteBuffer cmdBuffer = ByteBuffer.allocate(HEADER_SIZE+payloadArray.length);
//create command
ByteBuffer lengthBuf = ByteBuffer.allocate(2);
lengthBuf.order(ByteOrder.BIG_ENDIAN);
lengthBuf.putChar((char)(size-2));
cmdBuffer.put(lengthBuf);
cmdBuffer.put(getFlag());
执行最后一个命令后,cmdBuffer
的前两个字节应显示getFlag()
和lengthBuf
的值。但是,这在cmdBuffer
内部不可见。
我不确定这里有什么问题。有人可以帮忙吗?
答案 0 :(得分:0)
我怀疑原因是lengthBuf
中没有剩余的字节。
来自putChar(char)
上的JavaDoc:
以当前字节顺序将包含给定char值的两个字节写入当前位置的此缓冲区,然后将位置递增2。
来自put(ByteBuffe)
上的JavaDoc:
...
否则,此方法从给定缓冲区将n = src.remaining()字节复制到此缓冲区中,从每个缓冲区的当前位置开始。然后将两个缓冲区的位置递增n。
因此put操作从lengthBuf
的当前位置读取,这是结束,没有剩余字节。
在lengthBuf.reset()
之后尝试putChar(...)
,这应该仅重置位置。请注意,可能不支持缓冲区实施reset()
,但ByteBuffer.allocate()
会创建支持该操作的HeapByteBuffer
。
修改强>
Oleg Estekhin指出,您最好使用lengthBuf.flip()
代替lengthBuf.reset()
。
来自JavaDoc:
在一系列通道读取或放置操作之后,调用此方法以准备一系列通道写入或相对获取操作。