将 char 数组转换为字节数组并再次返回 [英] Converting char array into byte array and back again

查看:26
本文介绍了将 char 数组转换为字节数组并再次返回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望在不创建中间 String 的情况下将 Java char 数组转换为字节数组,因为 char 数组包含密码.我查找了几种方法,但它们似乎都失败了:

I'm looking to convert a Java char array to a byte array without creating an intermediate String, as the char array contains a password. I've looked up a couple of methods, but they all seem to fail:

char[] password = "password".toCharArray();

byte[] passwordBytes1 = new byte[password.length*2];
ByteBuffer.wrap(passwordBytes1).asCharBuffer().put(password);

byte[] passwordBytes2 = new byte[password.length*2];
for(int i=0; i<password.length; i++) {
    passwordBytes2[2*i] = (byte) ((password[i]&0xFF00)>>8); 
    passwordBytes2[2*i+1] = (byte) (password[i]&0x00FF); 
}

String passwordAsString = new String(password);
String passwordBytes1AsString = new String(passwordBytes1);
String passwordBytes2AsString = new String(passwordBytes2);

System.out.println(passwordAsString);
System.out.println(passwordBytes1AsString);
System.out.println(passwordBytes2AsString);
assertTrue(passwordAsString.equals(passwordBytes1) || passwordAsString.equals(passwordBytes2));

断言总是失败(而且,关键的是,当代码在生产中使用时,密码被拒绝),但打印语句打印出密码三次.为什么 passwordBytes1AsStringpasswordBytes2AsStringpasswordAsString 不同,但看起来相同?我错过了一个空终止符还是什么?我该怎么做才能使转换和取消转换工作?

The assertion always fails (and, critically, when the code is used in production, the password is rejected), yet the print statements print out password three times. Why are passwordBytes1AsString and passwordBytes2AsString different from passwordAsString, yet appear identical? Am I missing out a null terminator or something? What can I do to make the conversion and unconversion work?

推荐答案

问题是你使用了 String(byte[]) 构造函数,它使用平台默认编码.这几乎是从不你应该做的——如果你传入UTF-16"作为字符编码来工作,你的测试可能会通过.目前我怀疑 passwordBytes1AsStringpasswordBytes2AsString 都是 16 个字符长,其他每个字符都是 U+0000.

The problem is your use of the String(byte[]) constructor, which uses the platform default encoding. That's almost never what you should be doing - if you pass in "UTF-16" as the character encoding to work, your tests will probably pass. Currently I suspect that passwordBytes1AsString and passwordBytes2AsString are each 16 characters long, with every other character being U+0000.

这篇关于将 char 数组转换为字节数组并再次返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆