String.getBytes(“UTF-32”)在JVM和Dalvik VM上返回不同的结果

时间:2012-11-29 15:15:33

标签: java android string jvm dalvik

我有一个48字符AES-192加密密钥,我用它来解密加密数据库。

然而,它告诉我密钥长度无效,所以我记录了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个字节?

2 个答案:

答案 0 :(得分:14)

您应该在两台计算机上指定字节顺序

final byte[] utf32Bytes = string.getBytes("UTF-32BE");

请注意,"UTF-32BE"是一种不同的编码,而不是特殊的.getBytes参数。它具有固定的字节顺序,不需要BOM。更多信息:http://www.unicode.org/faq/utf_bom.html#gen6

答案 1 :(得分:2)

为什么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