gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:43 27 4
gpt4 key购买 nike

我有一个小问题。我必须使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com