кодирование и декодирование буфера символов и байтов

Я пытаюсь понять способ кодирования, вот мой код для кодирования и декодирования строки.

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.wrap массива байтов из bytebuffer, строки не равны. Это добавление пробелов в конец, есть ли причина для этого?


person Sai Ganesh Pittala    schedule 30.05.2013    source источник


Ответы (1)


CharsetEncoder .encode не дает никаких гарантий относительно размера базового массива или того, что ByteBuffer на самом деле будет с массивом. Массив, поддерживающий буфер, больше, чем количество байтов, содержащихся в нем.

Вы должны увидеть разные числа, если запустите этот код:

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);
person McDowell    schedule 30.05.2013
comment
Да, мощность превышает лимит. Но это происходит только с несколькими текстами, а с несколькими другими текстами все в порядке. т. е. лимит и емкость совпадают. Есть ли какой-либо конкретный шаблон или какое-либо значение, из-за которого емкость байтового буфера превышает предел? - person Sai Ganesh Pittala; 30.05.2013
comment
Это может быть незначительный дефект, но метод ведет себя так, как описано в документации. Я бы рассматривал это как деталь реализации и не обращался бы к базовому массиву, если только вы не собираетесь использовать методы position() и limit(), чтобы сообщить вам, какие части массива содержат данные. - person McDowell; 30.05.2013
comment
хм. Имеет смысл. Спасибо. - person Sai Ganesh Pittala; 30.05.2013