从 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[]
数组,例如。
我正在尝试了解获取作为 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[]
数组,例如。