Преобразование vb6 в c # - PullRequest
       3

Преобразование vb6 в c #

2 голосов
/ 18 августа 2011

Я пытаюсь преобразовать некоторый код VB6 в C #, и я немного борюсь.Я посмотрел на эту страницу ниже и другие похожие, но все еще в замешательстве.

Зачем использовать 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);

Любой совет, почему я не могу получить гекс для конвертации, был бы признателен,Я подозреваю, что это мое непонимание .Hex в строке 3 выше и «& H» в строке 1/2 выше.

1 Ответ

8 голосов
/ 18 августа 2011

Примечание : Этот ответ был написан в точке, где в вопросе все еще присутствовали строки 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), а затем присваивает результат целому числу, вызывая неявное преобразование.Это на самом деле не нужно, использование CInt будет правильным.Видимо, код VB6 был написан кем-то, кто не понимал, что (а) тип данных Decimal и (б) представление числа в десятичной записи - это две совершенно разные вещи.


Итак, как мне преобразовать между строками в шестнадцатеричной записи и числовыми типами данных в 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 просто не существует.

...