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

时间:2015-11-18 21:59:19

标签: java encryption encoding utf-8

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

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

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

1 个答案:

答案 0 :(得分:9)

问题是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.