将 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));
断言总是失败(而且,关键的是,当代码在生产中使用时,密码被拒绝),但打印语句打印出密码三次.为什么 passwordBytes1AsString
和 passwordBytes2AsString
与 passwordAsString
不同,但看起来相同?我错过了一个空终止符还是什么?我该怎么做才能使转换和取消转换工作?
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"作为字符编码来工作,你的测试可能会通过.目前我怀疑 passwordBytes1AsString
和 passwordBytes2AsString
都是 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.
相关文章