将vb6转换为c#

Gop*_*011 2 c# vb6-migration

我试图将一些vb6代码转换为c#,我有点挣扎.我看过下面的这个页面和其他类似的,但我仍然难过.

为何使用hex?

vb6代码如下:

    Dim Cal As String
    Cal = vbNull

    For i = 1 To 8
        Cal = Cal + Hex(Xor1 Xor Xor2)
    Next i
Run Code Online (Sandbox Code Playgroud)

这是我的c#代码 - 它仍然有一些错误.

        string Cal = null;
        int Xor1 = 0;
        int Xor2 = 0;

        for (i = 1; i <= 8; i++)
            {
            Cal = Cal + Convert.Hex(Xor1 ^ Xor2);
            }
Run Code Online (Sandbox Code Playgroud)

错误是:

        Cal = Cal + Convert.Hex(Xor1 ^ Xor2 ^ 6);
Run Code Online (Sandbox Code Playgroud)

关于为什么我不能让十六进制转换的任何建议将不胜感激.我怀疑我对上面第3行的.Hex和上面第1/2行的"&H"缺乏了解.

Hei*_*nzi 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(实际上,转换为Decimal子类型Variant),然后将结果分配给整数,从而导致隐式转换.这实际上没有必要,使用CInt是正确的.显然,VB6代码是由一个不明白(a)Decimal数据类型和(b)用十进制表示法表示数字的人编写的两个完全不同的东西.


那么,如何在十六进制表示法和C#中的数字数据类型之间转换字符串?

要将十六进制字符串转换为数字使用

int number = Convert.ToInt32(hex, 16);   // use this instead of Convert.ToDecimal
Run Code Online (Sandbox Code Playgroud)

在C#中,无需在开头填充"&H"值.第二个参数16告诉转换函数该值是基数16(即十六进制).

另一方面,要将数字转换为十六进制表示,请使用

string hex = number.ToString("X");       // use this instead of Convert.ToHex
Run Code Online (Sandbox Code Playgroud)

你正在使用的,Convert.ToDecimal做了一些完全不同的事情:它将一个值转换为decimal数据类型,这是一种特殊的数据类型,用于具有小数精度的浮点数.那不是你需要的.你的另一种方法Convert.Hex根本不存在.