我正在尝试将byte []转换为float [],方法是将byte []转换为ByteBuffer,将其转换为FloatBuffer(.asFloatBuffer
),然后将其转换为数组。 / p>
private static float[] toFloatArray(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
return buffer.asFloatBuffer().array();
}
然而跑步:
byte[] bytes = {14,32,26,21};
toFloatArray(bytes);
给我一个java.lang.UnsupportedOperationException
at java.nio.FloatBuffer.array(Unknown Source)
。
我相信文档说错误与缓冲区没有数组支持(???)。
任何人都知道如何解决这个问题,或者我应该如何将此数组转换为浮点数?
答案 0 :(得分:10)
private static float[] toFloatArray(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
FloatBuffer fb = buffer.asFloatBuffer();
float[] floatArray = new float[fb.limit()];
fb.get(floatArray);
return floatArray;
}
例如:
byte[] bytes = {65,-56,0,0 , 65,-56,0,0};
float[] result = toFloatArray(bytes);
//print 25.0 25.0
System.out.println(Arrays.toString(result));
答案 1 :(得分:1)
从float
包裹的byte[]
数组中获取ByteBuffer
的简单方法是使用getFloat()
读取接下来的4个字节并返回生成的float
1}}。如果byte[]
包含超过4个字节,则可以循环执行此操作。请注意,该方法抛出
BufferUnderflowException - 如果少于四个字节 留在这个缓冲区
您也可以从FloatBuffer
获取
buffer.asFloatBuffer().get();
如果您愿意,array()
如果实例的UnsupportedOperationException
字段为hb
则会引发null
。如果查看Oracle JDK 7的源代码,可以发表评论
final float[] hb; // Non-null only for heap buffers
如果您运行代码,您会注意到返回的FloatBuffer
是ByteBufferAsFloatBufferB
,而不是HeapFloatBuffer
。
答案 2 :(得分:1)
public static float[] toFloatArray(byte[] bytes) {
float[] floats = new float[bytes.length/4];
ByteBuffer.wrap(bytes).asFloatBuffer().get(floats).array();
return floats;
}
你不能做return ByteBuffer.wrap(bytes).asFloatBuffer().array();
的原因是它创建了一个这个字节缓冲区的视图作为浮点缓冲区。这意味着它使用相同的内存。这很快,但是需要一个地方把它放在不被视为float []和byte []的内存中,这就是为什么它不能在没有新内存的情况下为你提供数据。
public static void convertFloatArray(byte[] bytes, float[] floats) {
ByteBuffer.wrap(bytes).asFloatBuffer().get(floats,0,bytes.length/4);
}
只是这个类不会创造自己的记忆,而是摆弄你给它的记忆,这很棒,但有时可能会让人感到困惑。