VbStarter, твой второй вариант - фейл. Там не плюс, а сдвиг должен быть.
Ahtoxa, еще раз повторю. url(k + 1) - это Char, т.е. 2байтный юникодный символ, операция сдвига для символов не определена. Отсюда и ошибка, что сдвиг не определён для Char и Integer (8, 16, 24). Надо перед сдвигом конвертировать символ в число с помощью Convert.ToUInt32, а не пытаться конвертировать результат.
Но вот откуда оверфлоу не понятно. Мне кажется прибавляется дофига большое число к a. Пробуй присвоить a изначально 0, или использовать везде UInt64 (и ToUInt32), разделить строку на несколько строк, чтобы более конкретно понять, где происходит переполнение
Вот блин, снова
Уже теперь в функции Mix во второй строке "a = a - c" - Arithmetic operation resulted in an overflow.
a = 1 868 983 913, c = 3 862 272 612, т.е. должно получится отрицательное число, что недопустимо для ULong и UInteger.
Хотя в C# как-то работало, предполагаю что изначально в алгоритме предусматривалось что a, b, c - положительные, но у меня они неправильно рассчитались в функции GoogleChecksum.
Вот весь код:
PrivateSharedSub Mix(ByRef a As ULong, ByRef b As ULong, ByRef c As ULong)
Запустил параллельно исходник на C# и на VB.NET
Всунул MessageBox в коде на C# в том же месте - получил такие же данные.
На VB.NET в цикле While после первого исполнения функции mix ругается на первую её строчку:
"a -= b" - Arithmetic operation resulted in an overflow.
Первый MessageBox: 228 452 386|229 040 371
Второй MessageBox: 4 294 379 311|229 040 371
a - b = 228 452 386-229 040 371 = - 587 985
Откуда такое a большое получилось?
4 294 379 311 может получится только так - верхняя граница Uint 4 294 967 295 - 587 985 + 1 = 4 294 379 311
Это то, о чём я написал выше. Вычитание происходит одинаково для знаковых и беззнаковых, а вот интерпретируются значения по-разному. Результатом здесь будет 1111 1111 1111 0111 0000 0111 0010 1111
В int это выглядит как -587.985, в uint - как 4.294.379.311
А бейсик видимо проверяет перед вычитанием, не получится ли результат выходящим за границы типа. И выдаёт ошибку.
Не смотрел код, но из обсуждения полагаю, что переполнение происходит при присваивании отрицательного числа к беззнаковому типу.
В C# код работает, потому что там по умолчанию отключена проверка арифметических переполнений.
В VB .NET по умолчанию эта проверка включена, но ее можно отключить.
свойства проекта - вкладка Compile - Advanced compile options - опция Remove integer overflow checks (ее нужно активировать).
Побочный эфект состоит в том, что проверка отключится во всем проекте. Нет ключевого слова unchecked, как в C#, позволяющего отключить проверку переполнения локально. А проверку переполнений лучше иметь, так как почти во всех случаях при переполнении с отключенной проверкой мы получим мусор, который не предполагалось иметь, который вызывает некорректную работу программы - в таких случаях предпочтитетльнее ловить исключение.
другой вариант - делать присваивание через BitConverter - он позволяет копировать данные на бинарном уровне (т.е. как они представлены в памяти единицами и нулями)