gpt4 book ai didi

java - 从 Java 对象转换为 float

转载 作者:行者123 更新时间:2023-12-02 03:33:46 26 4
gpt4 key购买 nike

我试图了解获取数千种作为 Java 对象(字节数组)的 float 据类型的值的过程

我们在 C++ 中使用类似的方法,将数据存储在一个巨大的 char 数组中,然后使用 reinterpret_cast 将其简单地转换为 float 数组,然后对 float 数组进行处理:

// 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 或者是否有更有效的方法来做到这一点。如何将整个对象转换为 float 组?

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);
}

谢谢。

最佳答案

您不能将数据“转换”为 float[] 数组。但你可以使用 ByteBuffer#asFloatBuffer然后使用 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 中单独获取 float 更方便、更优雅,而且可能更高效。 (我没有为此做专门的基准测试,但据说某些批量方法“...可能比 JavaDoc 中的非批量方法更高效”)

<小时/>

编辑:可能与 future 相关的旁注:目前还无法将数据“转换”为 float[] 数组。。但事实上,巴拿马项目中也解决了类似的问题(!):http://hg.openjdk.java.net/panama/panama/jdk/rev/42bf13af7c8b (我还没有详细研究提交,但目标基本上似乎是将“任意”内存区域交给 JVM,并让它看起来像一个 float[] 数组,例如示例。

关于java - 从 Java 对象转换为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com