2013-05-30 70 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

嗯。说得通。谢谢。 –