字符和字节缓冲区编码&解码

时间:2013-05-30 07:00:02

标签: java encoding decoding

我正在尝试理解编码方式,这是我编码和解码字符串的代码。

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执行解码时,字符串不相等。它最后是追加空间,背后有原因吗?

1 个答案:

答案 0 :(得分: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);