我正在尝试将一些vb6代码转换为c#,我正在努力一点。 我看过下面的这个页面和其他类似的页面,但我仍然感到难过。
下面的vb6代码:
Dim Cal As String
Cal = vbNull
For i = 1 To 8
Cal = Cal + Hex(Xor1 Xor Xor2)
Next i
这是我的c#代码 - 它仍有一些错误。
string Cal = null;
int Xor1 = 0;
int Xor2 = 0;
for (i = 1; i <= 8; i++)
{
Cal = Cal + Convert.Hex(Xor1 ^ Xor2);
}
错误是:
Cal = Cal + Convert.Hex(Xor1 ^ Xor2 ^ 6);
关于为什么我不能让十六进制转换的任何建议将不胜感激。 我怀疑我对上面第3行的.Hex和上面第1/2行的“&amp; H”缺乏了解。
答案 0 :(得分:8)
注意:此答案是在问题中仍然存在Xor1 = CDec("&H" + Mid(SN1, i, 1))
和Xor1 = Convert.ToDecimal("&H" + SN1.Substring(i, 1));
行的位置编写的。
什么是&H
?
在Visual Basic(旧的VB6和VB.NET)中,可以通过为&H
添加前缀来使用十六进制常量。例如,myValue = &H20
会将值32
分配给变量myValue
。由于这种惯例,VB6的转换函数也接受了这种表示法。例如,CInt("20")
返回整数20
,CInt("&H20")
返回整数32
。
您的代码示例使用CDec
将值转换为数据类型Decimal
(实际上,转换为Variant
的Decimal子类型),然后将结果分配给整数,从而导致隐式转换。这实际上没有必要,使用CInt
是正确的。显然,VB6代码是由不理解(a)Decimal
数据类型和(b)表示十进制表示法中的数字的人编写的两个完全不同的东西。
那么,如何在十六进制表示法和C#中的数字数据类型之间转换字符串?
要将十六进制字符串转换为数字,请使用
int number = Convert.ToInt32(hex, 16); // use this instead of Convert.ToDecimal
在C#中,无需在开头用“&amp; H”填充值。第二个参数16
告诉转换函数该值是基数16(即十六进制)。
另一方面,要将数字转换为十六进制表示,请使用
string hex = number.ToString("X"); // use this instead of Convert.ToHex
您使用的是Convert.ToDecimal
,它完全不同:它将值转换为decimal
数据类型,这是一种特殊数据类型,用于具有小数精度的浮点数。那不是你需要的。您的其他方法Convert.Hex
根本不存在。