2016-06-08 39 views
0

我想了解的過程獲得成千上萬的浮點數據類型的是過去作爲一個Java對象(byte數組)鑄造從Java對象到彩車

我們使用類似的方法在C++中我們存儲的值在一個巨大的字符數組中的數據,我們簡單地將其轉換爲使用float數組的reinterpret_cast並做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); 
    } 

謝謝。

+0

什麼樣的'Object'是'block.data'?在java中,你從來沒有直接得到一個對象(僅僅是一個參考)。 –

+0

它的字節數組 – Miek

回答

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單獨漂浮,它可能更有效。 (我沒有做這個專用的基準,但據說是某些大批量法「... 可能效率更高」比JavaDoc中的非大宗方法)


編輯:可能與未來相關的附註:無法將數據「投射」到float[]陣列還有。但實際上,在巴拿馬項目中解決了類似的問題(!):http://hg.openjdk.java.net/panama/panama/jdk/rev/42bf13af7c8b(我還沒有詳細研究提交,但目標基本上似乎是將一個「任意」內存區域交給JVM,讓它出現像float[]陣列,例如。

+0

感謝您的例子。我認爲必須有一個解決方案,我只是沒有找到。 – Miek

+0

至少我們可以說這些「潛在更有效率」不會比手動單元素循環更差。 – Holger