Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java中的ByteBuffer获取字节数组_Java_Arrays_Bytearray_Nio_Bytebuffer - Fatal编程技术网

从java中的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获取字节的推荐方法吗

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;
}