2016-01-27 44 views
1

我用ByteArray來創建一個新的字符串,但結果出乎意料地發生。這裏是我的代碼ByteBuffer.wrap出乎意料地

void foo(byte[] data, ...) 
{ 
    ByteBuffer byteBuf = ByteBuffer.wrap(data, 0, 15); 
    String msg = new String(byteBuf.array()); 
    Log.i("FOO", String.format("ByteArraySize=%d\t\tMsgLen=%d,%d", data.length, byteBuf.array().length, msg.length())); 
} 

字節數組的長度是518400.但是,日誌信息顯示:

ByteArraySize = 518400 MsgLen = 518400,518400

而不是

ByteArraySize = 518400 MsgLen = 15,15

Wh在錯誤?

回答

1

這是預期的結果。

ByteBuffer.wrap()的JavaDoc:

將字節數組包裝到緩衝區中。

新緩衝區將由給定的字節數組支持;也就是說,修改緩衝區將導致數組被修改,反之亦然。

而且ByteBuffer.array()

返回字節數組實現此緩衝區(可選操作)。

修改此緩衝區的內容將導致返回的數組內容被修改,反之亦然。

這意味着ByteBuffer.array()將返回與ByteBuffer.wrap()包裝的數組相同的數組。

+0

能不能請解釋什麼是包裝功能的使用情況下調用偏移量和長度參數,因爲新的緩衝區由實際支持相同的字節數組? –

+0

如果我想按字節,短褲,整數等('getInt()','putInt(int)'和其他)的順序訪問字節數組,我使用ByteBuffer。如果我只想訪問字節數組的一部分,那麼'ByteBuffer.wrap(byte [],int offset,int length)'是'ByteBuffer.wrap(byte [])'的一個很好的變體。 –

1

array()返回支持緩衝區的字節數組。

這是同一個對象。即byteBuf.array() == data

要構造一個字符串的data子陣列,使用: String msg = new String(data, 0, 15);