我有一个ByteBuffer,它有一个大小为1x50176x3
的多维数组。我想将这个ByteBuffer提取/转换回数组,这样我就可以访问其中的某些元素。实现这一点最有效的方法是什么?以下是我用来构建这个字节缓冲区的代码:
btBuf = ByteBuffer.allocateDirect(1 * 50176 * 3 * 4); //Allocate Memory
btBuf.order(ByteOrder.nativeOrder());
putDataInBuffer(btBuf); //Call to put the data in above ByteBuffer
您可以检查ByteBuffer是否由具有hasArray
的数组支持,如果是,则使用array
将其转换回。这很快,但并不是所有的缓冲区都是这样备份的。
您总是可以将ByteBuffer转换为数组,但这很难有效。相反,我会将它转换为任何基本数据类型的缓冲区(除非它是字节,在这种情况下你已经设置好了(,例如用asIntBuffer
表示int。然后手动计算索引,并用get(index)
访问元素。
例如,对于索引x、y和z,索引可以计算为x + y*width + z*width*height
,其中width
是x维度大小,height
是y维度大小。
如果向转换为缓冲区的数组进行写入,则可能需要进行实验,以确保计算索引的方式与数组执行任务的方式一致。
EDIT:使用allocateDirect,缓冲区不由数组支持,因此要使用第二个方法。