将char 转换为byte

我想在Java中将字符数组转换为字节数组。 存在什么方法来进行这种转换?

char[] ch = ? new String(ch).getBytes(); 

要么

 new String(ch).getBytes("UTF-8"); 

获得非默认字符集。

更新:自Java 7以来: new String(ch).getBytes(StandardCharsets.UTF_8);

转换而不创buildString对象:

 private byte[] toBytes(char[] chars) { CharBuffer charBuffer = CharBuffer.wrap(chars); ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit()); Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data return bytes; } 

用法:

 char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; byte[] bytes = toBytes(chars); // Do something with chars/bytes Arrays.fill(chars, '\u0000'); // clear sensitive data Arrays.fill(bytes, (byte) 0); // clear sensitive data 

解决scheme的灵感来自Swing推荐,以char []存储密码。 (请参阅为什么char []首选string密码? )

请记住,不要将敏感数据写入日志,并确保JVM不会持有对它的任何引用。

编辑:安德烈的答案已更新,以下不再适用。

安德烈的答案(写作时的最高票数)稍微不正确。 我会添加这个评论,但我没有足够的信誉。

在Andrey的回答中:

 char[] chars = {'c', 'h', 'a', 'r', 's'} byte[] bytes = Charset.forName("UTF-8").encode(CharBuffer.wrap(chars)).array(); 

对array()的调用可能不会返回所需的值,例如:

 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(通过array()函数访问)的数组:

 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)); 

实际上char和byte在Java中可以有不同的大小,因为char可以容纳任何Unicode字符,最多可以达到16位。

你可以做一个方法:

 public byte[] toBytes(char[] data) { byte[] toRet = new byte[data.length]; for(int i = 0; i < toRet.length; i++) { toRet[i] = (byte) data[i]; } return toRet; } 

希望这可以帮助