2012-11-29 31 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的回答更準確地解決了這個問題。也謝謝你! –