2012-11-29 30 views
2

我有一个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个字节?

+1

为什么不抛售字节看? –

+0

@JonSkeet好主意。我会稍微编辑一下。 –

+3

它可能是BOM,00 00 FE FF – irreputable

回答

14

你应该在两台机器上指定字节序

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

注意"UTF-32BE"是不同的编码,没有特殊.getBytes参数。它具有固定的端点并且不需要BOM。更多信息:http://www.unicode.org/faq/utf_bom.html#gen6

+0

为什么会影响*字节数? –

+1

因为指定的UTF32不需要BOM。值得一试。 – Esailija

+0

啊是的。这是问题。他们现在都显示192。当系统让我时,我会接受。 –

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 
+0

虽然这对我所做的任务来说效果更好,但@ Esailija的回答更准确地解决了这个问题。也谢谢你! –