从java中的ByteBuffer获取字节数组
这是从ByteBuffer获取字节的推荐方法吗从java中的ByteBuffer获取字节数组,java,arrays,bytearray,nio,bytebuffer,Java,Arrays,Bytearray,Nio,Bytebuffer,这是从ByteBuffer获取字节的推荐方法吗 ByteBuffer bb =.. byte[] b = new byte[bb.remaining()] bb.get(b, 0, b.length); 这取决于你想做什么 如果您希望检索剩余的字节(在位置和限制之间),那么您所拥有的将起作用。你也可以这样做: ByteBuffer bb =.. byte[] b = new byte[bb.remaining()]; bb.get(b); 这与javadocs是等效的。这是一种获取字节[
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
这取决于你想做什么 如果您希望检索剩余的字节(在位置和限制之间),那么您所拥有的将起作用。你也可以这样做:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
这与javadocs是等效的。这是一种获取
字节[]
的简单方法,但使用字节缓冲区的部分意义在于避免创建字节[]
。也许您可以从字节[]
直接从字节缓冲区
中获取您想要的任何内容。请注意,bb.array()不支持字节缓冲区位置,如果您正在处理的字节缓冲区是其他缓冲区的一部分,则情况可能会更糟
即
这可能不是你想要做的
如果您确实不想复制字节数组,一种解决方法可能是使用字节缓冲区的arrayOffset()+剩余(),但这仅在应用程序支持其所需字节缓冲区的索引+长度时才起作用。final ByteBuffer buffer;
if(buffer.hasArray()){
最后一个字节[]数组=buffer.array();
final int arrayOffset=buffer.arrayOffset();
返回array.copyOfRange(数组,arrayOffset+buffer.position(),
arrayOffset+buffer.limit());
}
//做点别的
如果不知道给定(直接)ByteBuffer的内部状态,并且想要检索缓冲区的全部内容,可以使用以下方法:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
就这么简单
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
但通常您需要调用占用字节[]的东西(不是在您自己的代码中),因此转换不是可选的。正确。请注意,bb.capacity()。请参见ByteBuffer.slice()
。注意,为了避免更改缓冲区的位置,我使用了bb.slice().remaining()
。这样,它看起来就像一个干净的转储,而不触及原始缓冲区。这个方法给我带符号的字节,但我想要无符号的字节…知道吗?Java没有无符号整数的概念,只有带符号的整数。如果需要“无符号字节”,则需要强制转换为int
并使用位掩码:int unsigned_byte=b[k]&0xff
获取k
的某个值。如果要将整个缓冲区放入字节数组,是否先调用ByteBuffer#clear
?ByteBuffer.get(byte[])
返回一个ByteBuffer
和。。。?抱歉,不确定您的意思。问题是如何从字节缓冲区转换为字节[]。一旦调用,它们就位于数据
变量中。getter返回这个
,查看它的Javadoc。谢谢,我没有得到这个。由于get方法正在返回一个值,我不希望它也会有副作用。“bb.array()不支持字节缓冲区位置”,您能提供关于这一部分的更多细节吗。我理解slice示例,但需要更多关于bb.array()出错原因的详细信息
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}