从Java对象强制转换为浮动
我试图理解获取数千个浮点数据类型作为Java对象(字节数组)过去的值的过程从Java对象强制转换为浮动,java,casting,bytebuffer,Java,Casting,Bytebuffer,我试图理解获取数千个浮点数据类型作为Java对象(字节数组)过去的值的过程 我们使用C++中的类似方法,将数据存储在一个大字符数组中,然后使用RealTytCask将其转换成浮点数组,并对浮点数组进行工作: // Get the data. char *data = signalBlock->getData(); float *eegData = reinterpret_cast<float*>(data); 我想知道这是否适用于Java,或者是否有更有效的方法来实现这一点。
我们使用C++中的类似方法,将数据存储在一个大字符数组中,然后使用RealTytCask将其转换成浮点数组,并对浮点数组进行工作:
// Get the data.
char *data = signalBlock->getData();
float *eegData = reinterpret_cast<float*>(data);
我想知道这是否适用于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);
}
byte[]数据字节=(byte[])(block.data);//data是一个java对象
ByteBuffer-dataBuffer=ByteBuffer.wrap(数据字节);
dataBuffer.order(ByteOrder.LITTLE_ENDIAN);
对于(int i=0;i<200000;i+=4){
float fVal=dataBuffer.getFloat(i);
系统输出打印项次(fVal);
}
谢谢。您不能将数据“强制”到浮点[]
数组中。但您可以使用,然后使用:
或者,如果您喜欢简洁流畅的风格:
byte[] dataBytes = ....;
float floatArray[] = new float[dataBytes.length / Float.BYTES];
ByteBuffer dataBuffer = ByteBuffer.wrap(dataBytes)
.order(ByteOrder.LITTLE_ENDIAN)
.asFloatBuffer()
.get(floatArray);
这比从ByteBuffer
单独获取浮点数更方便、更优雅,而且可能更高效。(我没有为此做专门的基准测试,但某些批量方法被认为比JavaDocs中的非批量方法“……可能更有效”)
编辑:可能与未来相关的旁注:目前还无法将数据“转换”到
float[]
数组中。但事实上,类似的(!)也在巴拿马项目中得到了解决:(我还没有详细研究提交,但目标基本上似乎是将一个“任意”内存区域交给JVM,让它看起来像一个float[]
数组。您不能将数据“强制”到float[]
array。但您可以使用,然后使用:
或者,如果您喜欢简洁流畅的风格:
byte[] dataBytes = ....;
float floatArray[] = new float[dataBytes.length / Float.BYTES];
ByteBuffer dataBuffer = ByteBuffer.wrap(dataBytes)
.order(ByteOrder.LITTLE_ENDIAN)
.asFloatBuffer()
.get(floatArray);
这比从ByteBuffer
中单独获取浮点数更方便、更优雅,而且可能更高效。(我没有为此做专门的基准测试,但某些批量方法据说比JavaDocs中的非批量方法“……可能更高效”)
编辑:一个可能与未来相关的旁注:目前还不可能将数据“转换”到
float[]
数组中。但事实上,类似的(!)在巴拿马计划中也得到了解决:(我还没有详细研究提交,但目标基本上似乎是移交一个“任意”的例如,让它看起来像一个float[]
数组。什么类型的对象
是块。数据
?在java中,你永远不会直接得到对象(只是一个引用)。什么类型的对象
是块。数据
?在java中,你永远不会直接得到对象(只是一个引用)。谢谢你的例子。我想一定有一个我找不到的解决方案。至少我们可以说这些“可能更高效”的性能不会比手动单元素循环差。谢谢你的例子。我想一定有一个我找不到的解决方案。至少我们可以说这些“可能更高效”的性能不会比手动单元素循环差。
byte[] dataBytes = ....;
float floatArray[] = new float[dataBytes.length / Float.BYTES];
ByteBuffer dataBuffer = ByteBuffer.wrap(dataBytes)
.order(ByteOrder.LITTLE_ENDIAN)
.asFloatBuffer()
.get(floatArray);