1

有没有结合 ByteBuffer 和 FloatBuffer 的好方法?例如,我获取byte[]数据,我需要将其转换为float[]数据,反之亦然:

byte[]float[](java.lang.UnsupportedOperationException):

byte[] bytes = new bytes[N];
ByteBuffer.wrap(bytes).asFloatBuffer().array();

float[]byte[](作品):

float[] floats = new float[N];
FloatBuffer floatBuffer = FloatBuffer.wrap(floats);
ByteBuffer byteBuffer = ByteBuffer.allocate(floatBuffer.capacity() * 4);
byteBuffer.asFloatBuffer().put(floats);
byte[] bytes = byteBuffer.array();
4

2 回答 2

1

array()是 and 的可选操作,仅当支持实际实现在具有适当类型的数组顶部时才受支持。ByteBufferFloatBufferBuffer

相反,get当您不知道缓冲区的实际实现方式时,使用将缓冲区的内容读入数组。

于 2012-07-08T18:46:58.717 回答
1

为了补充 Louis 的答案,Java 中的数组受到限制,因为它们必须是独立的内存区域。不可能有一个数组是另一个数组的视图,无论是指向另一个数组中的某个偏移量还是将另一个数组的字节重新解释为不同的类型。

创建缓冲区(ByteBufferFloatBuffer等)是为了克服这一限制。它们等同于数组,因为它们编译成与数组访问一样快的机器指令,尽管要求程序员使用看似函数调用的东西。

为了获得最佳性能和最小内存使用量,您应该使用ByteBuffer.wrap(bytes).asFloatBuffer()然后调用get()and put()

要获得一个浮点数组,您必须分配一个新数组并将数据复制到其中ByteBuffer.wrap(bytes).asFloatBuffer().get(myFloatArray)

ByteBuffer的array方法不是任何人通常都应该使用的。除非 Buffer 正在包装一个数组(而不是指向某个内存映射区域,如文件或原始非 GC 内存)并且该数组与缓冲区的类型相同,否则它将失败。

于 2014-12-15T19:44:05.927 回答