2016-06-12 100 views
3

我有一個字節數組需要重新打包爲一個long數組。輸入字節數組的大小未知(大約從0到幾百)。長陣列需要出來右對齊即最低索引long應該用零填充,所有其他應該填滿輸入字節: 。 (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11)→(xxxxb0b1b2b3,b4b5b6b7b8b9b10b11)在java中將byte []轉換爲long []

其中b1,b2等是給定字節。 我有一個解決方案,但它不是很整齊或可讀:

// outArr has length (inArr.length+7)/8 

for (int i = 0; i < inArr.length ; i++) {  
    outArr[outArr.length - i/8 - 1] |= ((long)inArr[inArr.length - i - 1]) << (i % 8) * 8; 
    } 

有沒有這樣做的不太醜陋的方式?

+0

請看看http://stackoverflow.com/questions/4485128/how-doi-i-轉換長字節返回in-java –

回答

2

可能有更好的方法來做到這一點,但一種方法可能是使用java.nio緩衝區來轉換它。由於需要將輸入數組對齊到8個字節塊,因此需要執行幾個步驟:

int padding = outArr.length * 8 - inArr.length; 
ByteBuffer buffer = ByteBuffer.allocate(inArr.length + padding) 
           .put(new byte[padding]).put(inArr); 
buffer.flip(); 
buffer.asLongBuffer().get(outArr); 
+0

'ByteByffer.wrap(inArr)'還有點短。可能需要'order(LITTLE_ENDIAN)'。但確實ByteBuffer是解決方案。 –

+0

是的,這會更短,但由於需要填充,它不能解決_whole_問題,因爲您需要首先正確填充字節數組。這就是我用兩個'put()'和'flip()'構建字節緩衝區的方法。關於命令;默認的'BIG_ENDIAN'是正確的。 –