【问题标题】:char and byte buffer encoding & decoding字符和字节缓冲区编码和解码
【发布时间】:2013-05-30 07:00:02
【问题描述】:

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

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 执行解码时,字符串不相等。后面加了空格,有什么原因吗?

【问题讨论】:

    标签: java encoding decoding


    【解决方案1】:

    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);
    

    【讨论】:

    • 是的,容量超过了限制。但这仅发生在少数文本中,而其他文本很少发生。即限制和容量相同。是否有任何特定模式或任何值导致字节缓冲区的容量超过限制?
    • 这可能是一个小缺陷,但该方法的行为与记录的一样。我会将其视为实现细节而不访问底层数组,除非您打算使用 position()limit() 方法告诉您数组的哪些部分保存数据。
    • 嗯。说得通。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多