I\'m trying to convert a byte[] to a float[] by putting the byte[] in a ByteBuffer, converting this to a FloatBuffer (.asFloatBuffer
), and then converting this to a
public static float[] toFloatArray(byte[] bytes) {
float[] floats = new float[bytes.length/4];
ByteBuffer.wrap(bytes).asFloatBuffer().get(floats).array();
return floats;
}
The reason why you can't do return ByteBuffer.wrap(bytes).asFloatBuffer().array();
is that it creates a view of this byte buffer as a float buffer. Which means it's using the same memory. It's lightning fast, but needs a place to put it in memory that isn't being treated as a float[] AND byte[] hence why it can't give you the data back without new memory.
public static void convertFloatArray(byte[] bytes, float[] floats) {
ByteBuffer.wrap(bytes).asFloatBuffer().get(floats,0,bytes.length/4);
}
It's just the class doesn't make its own memory but fiddles with the memory you give it, which is awesome, but could be confusing at times.
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;
}
ex:
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));
The simple way to get a float
from a byte[]
array wrapped by a ByteBuffer
is to use getFloat()
which reads the next 4 bytes and returns the generated float
. You can do this in a loop, if your byte[]
contains more than 4 bytes. Note that the method throws
BufferUnderflowException - If there are fewer than four bytes remaining in this buffer
You can get it from the FloatBuffer
as well
buffer.asFloatBuffer().get();
if you want but array()
throws an UnsupportedOperationException
if the instance's hb
field is null
. If you look at the source code from Oracle JDK 7, there is a comment
final float[] hb; // Non-null only for heap buffers
If you run your code, you will notice the returned FloatBuffer
is a ByteBufferAsFloatBufferB
, not a HeapFloatBuffer
.