在不使用String或Charset的情况下,将数组字符串转换为UTF-8中的字节数组

M.C*_*nov 3 java encryption encoding utf-8

我有一个小问题.我必须使用UTF-8对char数组进行编码,并使用Java获取与其相当的字节数组.将char数组转换为String而不是获取字节数组不是一个选项,因为安全问题,必须避免使用String.如果我使用

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

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

pru*_*nge 10

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

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

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

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