从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,或者是否有更有效的方法来实现这一点。

我试图理解获取数千个浮点数据类型作为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);