String.getBytes(“UTF-32”)在JVM和Dalvik VM上返回不同的结果
问题描述:
我有一个48字符的AES-192
加密密钥,我正在使用它来解密加密的数据库。String.getBytes(“UTF-32”)在JVM和Dalvik VM上返回不同的结果
但是,它告诉我密钥长度是无效的,所以我记录了getBytes()的结果。
当我执行:
final String string = "346a23652a46392b4d73257c67317e352e3372482177652c";
final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length);
在我的Mac(Java虚拟机)使用BlueJ的,我得到192
作为输出。
然而,当我使用:
Log.d(C.TAG, "Key Length: " + String.valueOf("346a23652a46392b4d73257c67317e352e3372482177652c".getBytes("UTF-32").length));
我得到196
作为输出。
有没有人知道为什么会发生这种情况,以及Dalvik从哪里获得额外的4个字节?
答
你应该在两台机器上指定字节序
final byte[] utf32Bytes = string.getBytes("UTF-32BE");
注意"UTF-32BE"
是不同的编码,没有特殊.getBytes
参数。它具有固定的端点并且不需要BOM。更多信息:http://www.unicode.org/faq/utf_bom.html#gen6
答
为什么你会UTF-32编码纯十六进制数字。这比它需要的大8倍。 :P
String s = "346a23652a46392b4d73257c67317e352e3372482177652c";
byte[] bytes = new BigInteger(s, 16).toByteArray();
String s2 = new BigInteger(1, bytes).toString(16);
System.out.println("Strings match is "+s.equals(s2)+" length "+bytes.length);
打印
Strings match is true length 24
+0
虽然这对我所做的任务来说效果更好,但@ Esailija的回答更准确地解决了这个问题。也谢谢你! –
为什么不抛售字节看? –
@JonSkeet好主意。我会稍微编辑一下。 –
它可能是BOM,00 00 FE FF – irreputable