从 Java 对象转换为浮点数

Casting to floats from Java Object

我正在尝试了解获取作为 Java 对象(字节数组)

的数千种浮点数据类型的值的过程

我们在 C++ 中使用了类似的方法,我们将数据存储在一个巨大的字符数组中,然后我们简单地使用 reinterpret_cast 将其转换为浮点数组,然后在浮点数组上进行操作:

// Get the data.
char *data = signalBlock->getData();
float *eegData = reinterpret_cast<float*>(data);

在 Objective C 中,我们将数据存储在一个 NSData 对象中,并且我们能够使用这个简单的例程转换数据:

 // Get the signal Data.
 NSData* data = signalBlock.data;
 float* floatData = (float*)malloc(dataBlockSize);
 [data getBytes:floatData length:dataBlockSize];

我想知道这是否适合 Java 或者是否有更有效的方法来做到这一点。如何将整个对象转换为浮点数组?

byte[] dataBytes = (byte[])(block.data); // block.data is a java object

ByteBuffer dataBuffer = ByteBuffer.wrap(dataBytes);
dataBuffer.order(ByteOrder.LITTLE_ENDIAN);


    for(int i = 0; i < 200000; i+=4){

        float fVal = dataBuffer.getFloat(i);
        System.out.println(fVal);
    }

谢谢。

您不能"cast"将数据放入float[]数组中。但是你可以使用 ByteBuffer#asFloatBuffer and then fetch the data using the relative bulk get method:

byte[] dataBytes = ...;

ByteBuffer dataBuffer = ByteBuffer.wrap(dataBytes);
dataBuffer.order(ByteOrder.LITTLE_ENDIAN);

FloatBuffer floatBuffer = dataBuffer.asFloatBuffer();
float floatArray[] = new float[dataBytes.length / Float.BYTES];
floatBuffer.get(floatArray);

或者,如果您更喜欢简短、流畅的风格:

byte[] dataBytes = ....;
float floatArray[] = new float[dataBytes.length / Float.BYTES];
ByteBuffer dataBuffer = ByteBuffer.wrap(dataBytes)
    .order(ByteOrder.LITTLE_ENDIAN)
    .asFloatBuffer()
    .get(floatArray);

这比从 ByteBuffer 中单独获取浮点数更方便、更优雅,而且效率可能更高。 (我没有为此做专门的基准测试,但据说某些批量方法“... 可能比 JavaDocs 中的非批量方法更有效”)


编辑:可能与未来相关的旁注:无法将数据 "cast" 放入 float[] 数组 。但实际上,类似(!)的事情在巴拿马项目中得到解决:http://hg.openjdk.java.net/panama/panama/jdk/rev/42bf13af7c8b(我还没有详细研究提交,但目标基本上似乎是将一个 "arbitrary" 内存区域移交给JVM,让它看起来像一个 float[] 数组,例如。