2013-06-04 106 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#代码不完全是相同。但我这个解释希望你能构建它自己:)