11

我试图通过将 byte[] 放入 ByteBuffer 中,将其转换为 FloatBuffer ( .asFloatBuffer),然后将其转换为数组,从而将 byte[] 转换为 float[]。

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). 我相信文档说该错误与没有数组支持的缓冲区有关(???)。

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

4

3 回答 3

15
    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));
于 2013-10-27T22:58:55.263 回答
1

float从 abyte[]包裹的数组中获取 a 的简单方法ByteBuffer是使用getFloat()它读取接下来的 4 个字节并返回生成的float. 如果您byte[]包含超过 4 个字节,您可以在循环中执行此操作。请注意,该方法抛出

BufferUnderflowException - 如果此缓冲区中剩余的字节数少于四个

FloatBuffer你也可以从

buffer.asFloatBuffer().get();

如果你愿意,但如果array()实例UnsupportedOperationExceptionhb字段是null. 如果您查看 Oracle JDK 7 的源代码,则有注释

final float[] hb;  // Non-null only for heap buffers

如果你运行你的代码,你会注意到返回FloatBuffer的是 a ByteBufferAsFloatBufferB,而不是 a HeapFloatBuffer

于 2013-10-27T22:17:25.473 回答
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[] AND byte[] 的内存中,因此为什么它不能在没有新内存的情况下将数据返回给您。

public static void convertFloatArray(byte[] bytes, float[] floats) {
    ByteBuffer.wrap(bytes).asFloatBuffer().get(floats,0,bytes.length/4);
}

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

于 2017-05-22T03:51:55.580 回答