2010-02-06 78 views
16

我正在將一個進程移植到Java。在C#和C++中已經有工作版本。我有一個在C#中的部分,我做Marshal.Copy(...)將64個超長轉換爲512字節,並在C++中的行我用memmove(...)做同樣的事情。 Java中有什麼可用於實現相同的結果?我需要相同的二進制信息,只是字節而不是長整型。在Java中將long [64]轉換爲byte [512]?

編輯:

我移植到Java的原因是爲了採取的Java自然有便攜性的優勢。我不想使用本地代碼。

另一件事。由於Java不包含無符號值,因此我需要通過一點點改變我的請求。我想從64個long中的每一個(C#和C++中的ulong)中獲得8個無符號字節值,以便稍後可以在數組中使用這些值。這需要發生數千次,所以最快的方式將是最好的方式。

回答

20

ByteBuffer適用於此:只需輸入64 long值並使用array()方法獲得byte[]ByteOrder類可以有效地處理endian問題。例如,結合的方法在註釋建議通過wierob

private static byte[] xform(long[] la, ByteOrder order) { 
    ByteBuffer bb = ByteBuffer.allocate(la.length * 8); 
    bb.order(order); 
    bb.asLongBuffer().put(la); 
    return bb.array(); 
} 

附錄:將所得byte[]組件符號的8比特值,但是Java數組需要nonnegative integer index values。鑄造byteint將導致符號擴展,但掩蓋高階位會給出byte b的無符號值:

int i = (int) b & 0xFF; 

answer闡述了適用的運算符優先級規則。此相關的answer演示了double值的類似方法。

+1

+1你甚至不需要循環:bb.asLongBuffer()。put(la); – wierob 2010-02-06 12:02:48

+1

謝謝!您的建議更容易閱讀,並可能更有效。 http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod 2010-02-06 18:04:20

相關問題