我正在尝试将一些 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 行的“&H”。
最佳答案
注意:这个答案写在 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# 中,不需要在开头用“&H”填充值。第二个参数 16
告诉转换函数该值以 16 为底(即十六进制)。
另一方面,要将数字转换为其十六进制表示形式,请使用
string hex = number.ToString("X"); // use this instead of Convert.ToHex
您正在使用的 Convert.ToDecimal
做一些完全不同的事情:它将一个值转换为 decimal
数据类型,这是一种用于 float 的特殊数据类型- 具有小数精度的点数。那不是你需要的。您的其他方法 Convert.Hex
根本不存在。
关于c# - 将 vb6 转换为 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7106224/