2013-05-30 49 views
2

Java代碼應該具有與C#代碼相同的功能。這段代碼是否一樣?將C#snippit轉換爲Java

這是在C#代碼代碼:

byte[] hashBytes; 
UnicodeEncoding encoding = new UnicodeEncoding(); 
hashBytes = encoding.GetBytes(inputstr.Text.ToUpper().Trim()); 

SHA1 sha1 = new SHA1CryptoServiceProvider(); 

byte[] cryptPassword = sha1.ComputeHash(hashBytes); 
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
SHA1.Text = enc.GetString(cryptPassword); 
outputstr.Text = Convert.ToBase64String(cryptPassword); 

這裏是Java的移植代碼,但我得到不同的輸出:

byte[] pwBytes = new String("password".toUpperCase().getBytes(), "UTF-16").getBytes(); 

MessageDigest md = null; 
md = MessageDigest.getInstance("SHA-1"); 
byte[] sha1pw = md.digest(pwBytes); 

final BASE64Encoder encoder = new BASE64Encoder(); 
String encodedPw = encoder.encode(sha1pw); 

的Java代碼應該計算encodedPw以同樣的方式C#代碼計算outputstr.Text。

對不起,我無法運行C#代碼來提供示例。 Java代碼散列「密碼」爲oghZbO1T3U/eu3POLIIQweZ/gvQ=

+2

你能告訴我們不同的輸出嗎? –

+0

對不起,這個例子是密碼,所以我不能提供它。我編輯了這個問題。 – jcalfee314

+0

那麼你是說上面的兩段代碼用密碼「password」* do *產生相同的正確輸出嗎? – berry120

回答

1

UnicodeEncoding默認使用UTF-16 little endian in c#,而默認情況下,java中的UTF-16是big endian。所以在Java中你需要:

byte[] pwBytes = "password".toUpperCase().getBytes("UTF-16LE"); 
+0

這絕對有所作爲。我會盡快覈實並接受這個答案。謝謝你... – jcalfee314

+1

它的工作原理。我會指出LE是必需的。另外,我的兩次調用getBytes的代碼也是完全錯誤的。 – jcalfee314

+0

@ jcalfee314另請注意,在您的原始代碼中,您可以調用'getBytes()',它在您的機器上使用默認字符集。你使用'UTF-16'的地方只用於創建字符串,而不是字節數組。 – assylias