2009-08-24 70 views
1

我在java中,我想轉換成一個byte []一個int []。轉換一個int []爲byte []沒有創建新的對象

現在通常的做法是創建一個新的byte [],大小爲int數組的4倍,並將所有ints字節按字節複製到新的字節數組中。

但是這樣做的唯一原因是因爲Java的類型安全規則。 一個int數組已經是一個字節數組。它只是java不允許將int []轉換爲byte [],然後將其用作byte []。

有什麼辦法,也許使用jni,使int數組看起來像一個字節數組到Java?

+0

出於好奇,爲什麼你需要這樣做? – Adamski 2009-08-24 14:50:06

+1

性能原因 – pdeva 2009-08-24 14:51:32

+1

如果這對你來說是一個關鍵性能問題,那麼你可能會更好用另一種語言。 – izb 2009-08-24 15:54:40

回答

8

號沒有實現與一個本地Java陣列接口的對象的能力。

這聽起來像你想要一個包裝你的int []的對象,並呈現方法來以字節數組的方式訪問它。例如

public class ByteArrayWrapper { 
    private int[] array; 

    public int getLength() { 
     return array.length * 4; 
    } 

    public byte get(final int index) { 
     // index into the array here, find the int, and then the appropriate byte 
     // via mod/div/shift type operations.... 
    int val = array[index/4]; 
    return (byte)(val >> (8 * (index % 4))); 
    } 
} 

(上面是沒有測試/編譯等,並取決於你的字節序的要求。這純粹是說明

+0

我不認爲有可能定義一個呈現完整字節[]接口的類,包括索引並將其傳遞到需要byte []的地方。所以我認爲OP很可能需要創建一個副本。 – 2009-08-24 14:50:24

+0

馬丁是正確的。在需要傳遞byte []的情況下,不能使用此類。 – pdeva 2009-08-24 14:52:14

+2

@pdeva - 如上所述。這就是爲什麼我的答案開始「否」:-)在Martin的評論之後,我進一步*突出了這個問題。我不確定我能夠清楚多少,除了回答「否」。 – 2009-08-24 14:54:55

1

如果你真的不得不,你可以使用外部調用成C做到這一點,但我敢肯定它不能在語言中完成。

我也很好奇現有的代碼是什麼樣的,以及您期望的額外速度。

你知道優化的規則,對不對?

  • 1)不要優化。
  • 2)如果您是一個專家,見規則1.
  • 3)如果你是一個專家,已經寫最清晰可能的代碼,並且具有定時其失敗,那麼測試:
  • 3a)中寫一個優化的版本並留下未優化的代碼爲註釋
  • 3b)的複試,如果您優化的代碼沒有通過速度測試中,回覆!
  • 3C)正好解釋爲什麼你編碼這樣的評論。包括您的速度測量和參考要求。
  • 3D),如果第3條似乎有太多的工作,見規則1
+0

A減號?真?因爲你不能使用C調用來映射它(通過創建一個指向相同內存空間的新指針並返回它?),還是因爲某人不理解不優化的重要性? – 2009-08-25 23:19:58

+0

我想也許是因爲它關閉了話題?我當然喜歡閱讀它自己的優點! – spieden 2011-01-08 03:31:20

+0

我會對此表示贊成,但我不同意*「將未優化的代碼留作評論」*。我會建議在您的版本控制系統中創建一個分支。 – finnw 2011-01-22 16:30:09

3

根據您的具體要求,您可以使用NIO的java.nio.ByteBuffer類。做你的初始分配作爲一個ByteBuffer,並使用它的getIntputInt方法來訪問int值。當需要按字節訪問緩衝區時,可以使用getput方法。 ByteBuffer還有一個asIntBuffer方法,它將默認的get和put行爲更改爲int而不是byte。

如果您使用的是JNI,則直接分配的ByteBuffer(在某些情況下)允許在您的C代碼中直接訪問指針。

http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html