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

标签 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 个空元素,解码后有两个。这也不是一个选项,因为我想加密编码值。谢谢。

最佳答案

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

相关文章:

java - 在 Swing 架上执行 Java 应用程序期间出现空白屏幕

java - 为什么要编译?该代码似乎打破了对类型参数的限制

java - 杂交 : How to import media which is in the zip file in impex?

windows-phone-7 - 如何在Windows Phone 7中使用AES/ECB/PKCS7Padding算法?

c - OPENSSL 如何存储和恢复 key 来加密和解密消息?

security - 高效的 OAuth2.0 服务器/提供程序如何工作?

Python 字符串中的特殊字符

python - 如何使用 python 和 ffmpeg 库对视频进行转码(无命令行调用)

mysql - Rails/MySQL 奇怪的 UTF-8 编码问题

java - 无法将应用程序转换到类