UTF-8中的字符数组到字节数组,不使用String或Charset



我有一个小问题。我必须使用UTF-8对char数组进行编码,并使用Java获得与其等效的字节数组。将char数组转换为String并获得字节数组不是一种选择,出于安全考虑,必须避免使用String。如果我使用

byte[] encoded = Charset.forName("UTF-8").encode(CharBuffer.wrap(toBeEncoded)).array();

当输入数组的长度超过9个符号时,输出数组有一个空的额外元素。如果长度更长,则会有更多的空元素。然后我解码,我得到额外的元素。如果在编码之后我有一个空元素,那么在解码之后有两个。这也不是一个选项,因为我想加密编码的值。非常感谢。

问题是Charset.encode()不能保证它返回的缓冲区的容量。它很可能会在最后分配额外的空间,这就是你所看到的。但是,缓冲区的限制将被正确设置。事实上,根本不能保证返回的缓冲区会由数组支持(在未来的Java版本中,它可能会成为直接缓冲区,谁知道呢?)

要获得大小合适的数组,您需要制作大小合适的字节数组,并仅将所需的数据从字节缓冲区复制到该数组中。在这里,我们使用限制(即实际写入缓冲区的内容量)来调整新数组的大小:

ByteBuffer buf = StandardCharsets.UTF_8.encode(CharBuffer.wrap(toBeEncoded));
byte[] array = new byte[buf.limit()];
buf.get(array);

本文很好地描述了缓冲区的限制、容量和位置。

最新更新