我有一个小问题。我必须使用 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);
This article describes the limit, capacity and position of buffers nicely.
关于java - 不使用 String 或 Charset 的 UTF-8 字符数组到字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33791230/