字符数组中的字符数组以UTF格式表示
我有一个小问题。 我必须使用UTF-8对char数组进行编码,并通过使用Java来获得与它相同的字节数组。 将char数组转换为String而不是获取字节数组不是一个选项,因为安全考虑,必须避免使用String。 如果我使用
byte[] encoded = Charset.forName("UTF-8").encode(CharBuffer.wrap(toBeEncoded)).array();
当输入数组的长度大于9个符号时,输出数组有一个空的额外元素。 如果长度更长,则会有更多空元素。 然后我解码它,我会额外获得更多元素。 如果编码后我有1个空元素,解码后有两个。 这也不是一个选项,因为我想加密编码的值。 谢谢。
问题是Charset.encode()
不能保证它返回的缓冲区的容量。 最终可能会分配额外的空间,这就是你所看到的。 但是,缓冲区的限制将被正确设置。 事实上,并不能保证返回的缓冲区将被数组支持(它可以在未来的Java版本中成为直接缓冲区,谁知道呢?)
要获得一个正确大小的数组,你需要制作一个大小合适的字节数组,并且只将你想要的数据从字节缓冲区复制到该数组中。 这里我们使用限制(这是实际写入缓冲区的内容量)来调整新数组的大小:
ByteBuffer buf = StandardCharsets.UTF_8.encode(CharBuffer.wrap(toBeEncoded));
byte[] array = new byte[buf.limit()];
buf.get(array);
本文很好地描述了缓冲区的限制,容量和位置。
链接地址: http://www.djcxy.com/p/78437.html