2013-08-21 58 views
15

我試圖切片一個字節數組來修剪數組的第一部分。我使用的是ByteBuffer,但它不像我所期望的那樣。在Java中切片字節數組

byte[] myArray = new byte[10]; 
ByteBuffer buf = ByteBuffer.wrap(myArray); 
buf.position(5); 
ByteBuffer slicedBuf = buf.slice(); 
byte[] newArray = slicedBuf.array(); 

我期望newArray的大小爲5,只包含我的ByteBuffer的最後部分。而是返回完整的字節數組。我明白這是因爲「後臺緩衝區」一直都是一樣的。

我怎樣才能切片只有數組的所需部分?

編輯:添加上下文

字節從網絡接收。該緩衝形成這樣的:

[ SHA1 hash ] [ data... lots of it ]

我已經有一個函數,它接受一個字節數組作爲參數,並計算SHA1哈希。我想要的是切割完整的緩衝區,只傳遞沒有預期散列的數據。

+0

如果你沒有編寫哈希函數,如果你想避免複製,你有一個'byte []''中的所有東西都會卡住。爲什麼不從網絡中讀取散列成一個數組,並將數據讀入另一個數組? –

回答

45

您可以使用Arrays.copyOfRange方法。例如:

// slice from index 5 to index 9 
byte[] slice = Arrays.copyOfRange(myArray, 5, 10); 
+0

謝謝你的回答。你知道有沒有辦法做到這一點,而不需要複製?我的數組可以達到很多兆字節,所以我寧願避免在可能的情況下進行復制 – Eric

+0

字節數組中的字節不能被不同的數組重複使用。你有這個「ByteBuffer」類。或者,更改您的SHA1函數,以便它接受除了數組之外的片的偏移量和長度。 – Joni

+0

我不認爲我可以更改我的散列算法,因爲它是javax.crypto.mac。我無法控制傳遞給它的參數。 – Eric

5

您創建的ByteBuffer正受該數組支持。當你調用slice()你有效地接收特定認爲,數據的

創建新的字節緩衝區,其內容是此緩衝區內容的共享子序列。

所以調用array()就返回ByteBuffer返回完整的支持數組。

提取所有從這一觀點的字節數,你可以這樣做:

byte[] bytes = new byte[slicedBuf.remaining()]; 
slicedBuf.read(bytes); 

從該視圖中的字節將被複制到新的數組。

編輯從下面添加註釋:值得一提的是,如果你有興趣做的是從一個byte[]到另一個byte[]複製字節,沒有理由使用ByteBuffer;只需複製字節。

+0

基本上,如果您的答案中存在單詞「ByteBuffer」,那麼這是一個不好的答案。請參閱喬尼的答案韌皮(只有可接受的恕我直言)的答案。 – Bohemian

+2

我回答了OP的問題,而不是對他的意圖的解釋。另外,如果你的答案沒有任何解釋「爲什麼」事情起作用的內容,這是一個不好的答案。 –

+0

是的,謝謝你的回答。我從C移植代碼,我沒有任何複製,只有指針操作,所以我期待在Java中有類似的東西。我的數組可以達到很多兆字節,所以複製很浪費 – Eric