【问题标题】:Conversion vb6 to c#将vb6转换为c#
【发布时间】:2011-10-29 16:35:50
【问题描述】:

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

Why use hex?

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”缺乏理解。

【问题讨论】:

  • 抛出了什么异常?

标签: c# vb6-migration


【解决方案1】:

注意:此答案写在问题中仍然存在Xor1 = CDec("&H" + Mid(SN1, i, 1)) Xor1 = Convert.ToDecimal("&amp;H" + SN1.Substring(i, 1)); 行的位置。


&amp;H 是什么?

在 Visual Basic(旧的 VB6 和 VB.NET)中,可以通过在十六进制常量前面加上 &amp;H 来使用它们。例如,myValue = &amp;H20 会将值 32 分配给变量 myValue。由于这种约定,VB6 的转换函数也接受了这种表示法。比如CInt("20")返回整数20CInt("&amp;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 数据类型,这是一种用于具有十进制精度的浮点数的特殊数据类型。那不是你需要的。您的其他方法Convert.Hex 根本不存在。

【讨论】:

  • Cal += String.Format("{0:x}", Xor1 ^ Xor2 ^ 6);
  • Heinzi - 谢谢!非常感谢您花时间回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多