将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; }
希望这可以帮助