0

当我重写一个遗留应用程序时,我正在将一个 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# 生成的输出进行比较,但我现在无法做到这一点(这让我感到沮丧 - 相信我)。

4

2 回答 2

2

您不需要大幅更改原始文件 - C# 等效项(假设 'sb' 是 StringBuilder)只是:

sb.Append(((b & 0xFF) | 0x100).ToString("x").Substring(1, 2));
于 2013-06-04T15:08:03.573 回答
1

b & 0xFF将屏蔽最低字节。所以不管b是什么,你都会得到介于 0x00 和 0xFF 之间的东西。

在生成的整数中,第 9 位被设置,无论它之前是什么。所以你会有介于 0x0100 到 0x01FF 之间的东西。

从该字符串中,从索引 1 到 3 的子字符串被裁剪。它会给你最后两位数字,介于 00 和 FF 之间。| 0x100 是一个巧妙的技巧,让 Integer.toHexString 为您提供最后两位数字的前导零,根据它的 javadoc...

如果我没记错的话,你的 C# 代码并不完全相同。但我希望通过这个解释你可以自己建立它:)

于 2013-06-04T15:02:28.360 回答