char[] c = "aaaaaaaaaa".toCharArray();
System.out.println(Arrays.toString(Charset.forName("UTF-8").encode(CharBuffer.wrap(c)).array()));
输出:
[97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0]
可以看出,添加了一个零字节。要避免这种情况,请使用以下方法:
char[] c = "aaaaaaaaaa".toCharArray();
ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(c));
byte[] b = new byte[bb.remaining()];
bb.get(b);
System.out.println(Arrays.toString(b));
输出:
[97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
因为答案也暗示了使用密码,这可能是值得的
清空支持字节缓冲区的数组(通过
数组()函数):
ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(c));
byte[] b = new byte[bb.remaining()];
bb.get(b);
blankOutByteArray(bb.array());
System.out.println(Arrays.toString(b));
# 1 楼答案
# 2 楼答案
如果只想转换数据容器(数组)类型本身,只考虑数据大小,并且不知道任何编码:
# 3 楼答案
你可以做一个方法:
希望这有帮助
# 4 楼答案
或者
获取非默认字符集
更新:自Java 7:
new String(ch).getBytes(StandardCharsets.UTF_8);
# 5 楼答案
转换而不创建
String
对象:用法:
该解决方案的灵感来自Swing建议,将密码存储在char[]中。(见Why is char[] preferred over String for passwords?)
记住不要将敏感数据写入日志,并确保JVM不会包含任何对它的引用
上面的代码是正确的,但不是有效的。如果你不需要性能,但想要安全,你可以使用它。如果安全也不是一个目标,那么只需
String.getBytes
。如果你看不起JDK中encode
的实现,上面的代码是无效的。此外,还需要复制数组和创建缓冲区。另一种转换方法是内联所有代码隐藏encode
(例如UTF-8):请原谅我使用Scala语言。如果您在将代码转换为Java时遇到问题,我可以重写它。性能如何?始终检查真实数据(例如JMH)。这段代码看起来与JDK[2]和Protobuf[3]中的代码非常相似
# 6 楼答案
编辑:Andrey的答案已更新,因此以下内容不再适用
安德烈的回答(在撰写本文时投票率最高)略显保守 不准确的我本想加上这句话作为评论,但我不是 声誉很好
在安德烈的回答中:
对array()的调用可能不会返回所需的值,例如:
输出:
可以看出,添加了一个零字节。要避免这种情况,请使用以下方法:
输出:
因为答案也暗示了使用密码,这可能是值得的 清空支持字节缓冲区的数组(通过 数组()函数):