我在java中,我想轉換成一個byte []一個int []。轉換一個int []爲byte []沒有創建新的對象
現在通常的做法是創建一個新的byte [],大小爲int數組的4倍,並將所有ints字節按字節複製到新的字節數組中。
但是這樣做的唯一原因是因爲Java的類型安全規則。 一個int數組已經是一個字節數組。它只是java不允許將int []轉換爲byte [],然後將其用作byte []。
有什麼辦法,也許使用jni,使int數組看起來像一個字節數組到Java?
我在java中,我想轉換成一個byte []一個int []。轉換一個int []爲byte []沒有創建新的對象
現在通常的做法是創建一個新的byte [],大小爲int數組的4倍,並將所有ints字節按字節複製到新的字節數組中。
但是這樣做的唯一原因是因爲Java的類型安全規則。 一個int數組已經是一個字節數組。它只是java不允許將int []轉換爲byte [],然後將其用作byte []。
有什麼辦法,也許使用jni,使int數組看起來像一個字節數組到Java?
號沒有實現與一個本地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)));
}
}
(上面是沒有測試/編譯等,並取決於你的字節序的要求。這純粹是說明)
我不認爲有可能定義一個呈現完整字節[]接口的類,包括索引並將其傳遞到需要byte []的地方。所以我認爲OP很可能需要創建一個副本。 – 2009-08-24 14:50:24
馬丁是正確的。在需要傳遞byte []的情況下,不能使用此類。 – pdeva 2009-08-24 14:52:14
@pdeva - 如上所述。這就是爲什麼我的答案開始「否」:-)在Martin的評論之後,我進一步*突出了這個問題。我不確定我能夠清楚多少,除了回答「否」。 – 2009-08-24 14:54:55
如果你真的不得不,你可以使用外部調用成C做到這一點,但我敢肯定它不能在語言中完成。
我也很好奇現有的代碼是什麼樣的,以及您期望的額外速度。
你知道優化的規則,對不對?
根據您的具體要求,您可以使用NIO的java.nio.ByteBuffer
類。做你的初始分配作爲一個ByteBuffer,並使用它的getInt
和putInt
方法來訪問int值。當需要按字節訪問緩衝區時,可以使用get
和put
方法。 ByteBuffer還有一個asIntBuffer
方法,它將默認的get和put行爲更改爲int而不是byte。
如果您使用的是JNI,則直接分配的ByteBuffer(在某些情況下)允許在您的C代碼中直接訪問指針。
http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html
出於好奇,爲什麼你需要這樣做? – Adamski 2009-08-24 14:50:06
性能原因 – pdeva 2009-08-24 14:51:32
如果這對你來說是一個關鍵性能問題,那麼你可能會更好用另一種語言。 – izb 2009-08-24 15:54:40