UnsupportedOperationException with converting byte[] to float[]

前端 未结 3 1984
没有蜡笔的小新
没有蜡笔的小新 2021-02-15 01:57

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

相关标签:
3条回答
  • 2021-02-15 02:34
    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.

    0 讨论(0)
  • 2021-02-15 02:36
        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));
    
    0 讨论(0)
  • 2021-02-15 02:36

    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.

    0 讨论(0)
提交回复
热议问题