从Java对象

时间:2016-06-08 22:27:38

标签: java casting bytebuffer

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

我们在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,或者是否有更有效的方法来执行此操作。如何将整个对象转换为浮点数组?

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

谢谢。

1 个答案:

答案 0 :(得分:2)

您无法将数据“转换”为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单独获取花车更方便和优雅,而且效率更高。 (我没有为此做一个专门的基准测试,但是某些批量方法被称为“... 可能比JavaDocs中的非批量方法更高效

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