Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UnsupportedOperationException with converting byte[] to float[]

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 an array.

private static float[] toFloatArray(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.wrap(bytes);
    return buffer.asFloatBuffer().array();
}

However running:

 byte[] bytes = {14,32,26,21};
          toFloatArray(bytes);

Gives me a java.lang.UnsupportedOperationException at java.nio.FloatBuffer.array(Unknown Source). I believe the documentation says that the error has something to do with the buffer not being backed by an array (???).

Anyone has an idea how to fix this, or how I SHOULD convert this array to floats?

like image 756
user717572 Avatar asked Oct 27 '13 22:10

user717572


2 Answers

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.

like image 160
Sotirios Delimanolis Avatar answered Sep 21 '22 05:09

Sotirios Delimanolis


    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));
like image 33
Faton Avatar answered Sep 18 '22 05:09

Faton