2013-06-04 105 views
0

當我重寫遺留應用程序時,我正在將Java庫轉換爲C#,我需要一些幫助。我需要了解這條線是用Java做:將Java哈希轉換爲C#並需要幫助瞭解Java

sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1,3)) 

,如果這個C#線相當於

result += (Convert.ToInt32(b).ToString("x2") + " ").Substring(1,3); 

在這兩種情況下,b是一個SHA-1散列字節代碼是循環。 我不明白的Java部分是((b & 0xFF)| 0x100)。它看起來像是填充它?

通常我會將Java應用程序的輸出與我的C#所生成的輸出進行比較,但我現在不在這樣做的情況下(並且令我沮喪 - 相信我)。

+1

'&'是按位邏輯的「AND」,它會檢查比較下的變量的每一位,http://www.tutorialspoint.com/java/java_bitwise_operators_examples.htm – Xinus

+1

從粗略讀取,0xAA將變成「1AA」 '在java中和''AA「'在C#中。但也許我錯過了一些東西。 –

+2

b&0xFF將屏蔽最低字節,所以無論b是什麼,你都會得到0x00到0xFF之間的東西。在生成的整數中,無論以前是什麼,都會設置第9位。所以你會有0x0100到0x01FF之間的東西。從該字符串中,索引1到3的子字符串被裁剪。所以你最終會得到一個類似十六進制值在100和1FF之間的字符串。 – Fildor

回答

2

你不需要改變原有的,大大 - C#的當量(假設「SB」是一個StringBuilder)就是:

sb.Append(((b & 0xFF) | 0x100).ToString("x").Substring(1, 2)); 
+0

謝謝,那正是我所需要的。我能夠找到運行Java代碼的人,並測試輸出和所有匹配的東西。單元測試的萬歲!謝謝,戴夫! – Chuck

1

b & 0xFF將屏蔽最低字節。所以無論b是什麼,你都會得到0x00到0xFF之間的東西。

在生成的整數中,第9位被設置,無論以前是什麼。所以你會有0x0100到0x01FF之間的東西。

從該字符串中刪除索引1到3中的子字符串。它會給你最後兩位數字,它們將介於00和FF之間。 | 0x100是一個巧妙的把Integer.toHexString給你一個前導零爲最後兩個數字,它不會根據它的javadoc ...

如果我記得沒錯,你的C#代碼不完全是相同。但我這個解釋希望你能構建它自己:)