Примечание : Этот ответ был написан в точке, где в вопросе все еще присутствовали строки 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
просто не существует.