将byte []转换为float []的UnsupportedOperationException

时间:2013-10-27 22:04:56

标签: java arrays exception byte buffer

我正在尝试将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)。 我相信文档说错误与缓冲区没有数组支持(???)。

任何人都知道如何解决这个问题,或者我应该如何将此数组转换为浮点数?

3 个答案:

答案 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

如果您运行代码,您会注意到返回的FloatBufferByteBufferAsFloatBufferB,而不是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);
}

只是这个类不会创造自己的记忆,而是摆弄你给它的记忆,这很棒,但有时可能会让人感到困惑。