将Java哈希转换为C#,需要帮助理解Java

将Java哈希转换为C#,需要帮助理解Java,c#,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散列中的一个字节。 我不理解的Ja

我正在将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#正在生成的内容进行比较,但我现在无法这样做(这让我很沮丧-相信我)。

b&0xFF
将屏蔽最低的字节。所以无论
b
是什么,都会得到0x00和0xFF之间的值

在得到的整数中,设置第9位,不管它以前是什么。因此,您将得到0x0100到0x01FF之间的值

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


如果我没记错的话,你的C代码并不完全相同。但是我希望有了这个解释,您可以自己构建它:)

b&0xFF
将屏蔽最低的字节。所以无论
b
是什么,都会得到0x00和0xFF之间的值

在得到的整数中,设置第9位,不管它以前是什么。因此,您将得到0x0100到0x01FF之间的值

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


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

你不需要彻底改变原来的版本-C#等价物(假设“sb”是StringBuilder)只是:


您不需要彻底更改原始版本—C#等价物(假设“sb”是StringBuilder)只是:


“&”是按位逻辑的,“并且”,它将检查被比较变量的每一位,从粗略的读取来看,0xAA在java中变成
“1AA”
,在C中变成
“AA”
。但可能我遗漏了什么。b&0xFF将屏蔽最低的字节,所以无论b是什么,都会得到0x00和0xFF之间的内容。在得到的整数中,设置第9位,不管它以前是什么。因此,您将得到0x0100到0x01FF之间的值。从该字符串中裁剪索引1到3的子字符串。因此,您将得到一个类似于100到1FF之间的十六进制值的字符串。为什么在调用子字符串之前要在字符串中添加一个空格?噢,请更正我自己:子字符串(1,3)将给出最后两位数字,即介于00和FF之间的数字。|0x100是一个巧妙的整型技巧。toHexString为最后两位数字提供一个前导零,根据它的javadoc,“&”是按位逻辑的“并且”,它将检查比较中的每一位变量,从粗略的读取来看,0xAA在java中变成
“1AA”
,在C中变成
“AA”
。但可能我遗漏了什么。b&0xFF将屏蔽最低的字节,所以无论b是什么,都会得到0x00和0xFF之间的内容。在得到的整数中,设置第9位,不管它以前是什么。因此,您将得到0x0100到0x01FF之间的值。从该字符串中裁剪索引1到3的子字符串。因此,您将得到一个类似于100到1FF之间的十六进制值的字符串。为什么在调用子字符串之前要在字符串中添加一个空格?噢,请更正我自己:子字符串(1,3)将给出最后两位数字,即介于00和FF之间的数字。| 0x100是一个巧妙的技巧,让Integer.toHexString为最后两位数字提供前导零,根据它的javadoc,它不会提供前导零…谢谢,这正是我需要的。我能够找到运行Java代码的人,并测试输出,所有内容都匹配得很好。单元测试万岁!谢谢,戴夫!谢谢,这正是我需要的。我能够找到运行Java代码的人,并测试输出,所有内容都匹配得很好。单元测试万岁!谢谢,戴夫!
sb.Append(((b & 0xFF) | 0x100).ToString("x").Substring(1, 2));