2013-05-30 73 views
1

我想了解編碼方式,這裏是我的代碼來編碼和解碼一個字符串。字符和字節緩衝區編碼和解碼

Charset utfset = Charset.forName("UTF-8"); 
CharsetEncoder encoder = utfset.newEncoder(); 

String text = "java.abcded.tocken"; 
CharBuffer cb = CharBuffer.wrap(text.toCharArray()); 
ByteBuffer bb = encoder.encode(cb); 
byte[] bytes = bb.array(); 

CharsetDecoder isodecoder = utfset.newDecoder(); 

CharBuffer isodcb = isodecoder.decode(bb); 
System.out.println(String.valueOf(cb.array()).equals(String.valueOf(isodcb.array()))); 

CharBuffer isodcb2 = isodecoder.decode(ByteBuffer.wrap(bytes)); 
System.out.println(String.valueOf(cb.array()).equals(String.valueOf(isodcb2.array()))); 

當解碼用的ByteBuffer自身執行,字符串相等但是,當解碼與來自ByteBuffer的字節數組的bytebuffer.wrap進行,則字符串不相等。它追加空格到底,這背後有一個原因嗎?

回答

0

CharsetEncoder.encode對底層數組大小不作任何保證,ByteBuffer實際上也不會是backed by an array。支持緩衝區的數組大於包含在其中的字節數。

您應該看到不同的數字,如果你運行這段代碼:

CharsetEncoder encoder = StandardCharsets.UTF_8.newEncoder(); 

String text = "java.abcded.tocken"; 
CharBuffer cb = CharBuffer.wrap(text.toCharArray()); 
ByteBuffer bb = encoder.encode(cb); 
System.out.println(bb.remaining()); 
System.out.println(bb.array().length); 
+0

是,容量超過限制。但是這種情況只發生在很少的文字上,而其他文字很少。即限制和容量相同。是否有任何特定模式或任何導致bytebuffer容量超過限制的值? –

+0

它可能是一個小小的缺陷,但該方法的行爲與記錄。除非你打算使用'position()'和'limit()'方法來告訴你數組的哪些部分包含數據,否則我會將其視爲實現細節並且不訪問基礎數組。 – McDowell

+0

嗯。說得通。謝謝。 –