Арифметическая операция привела к алгоритму переполнения — иглобрюха.

Когда я выполняю этот код:

Dim bytearray() As Byte = System.IO.File.ReadAllBytes("C:\Users\Fery Ferdiansyah\Desktop\asd\asd.txt")
Dim key() As Byte = System.Text.Encoding.UTF8.GetBytes("swagger")
Dim bf As New blowfish2(key)

этот синтаксис y = S(0, a) + S(1, b) в этой функции вызывает арифметическое переполнение:

Private Function F(ByVal x As UInteger) As UInteger
    Dim a As UShort
    Dim b As UShort
    Dim c As UShort
    Dim d As UShort
    Dim y As UInteger

    d = CUShort((x And &HFF))
    x >>= 8
    c = CUShort((x And &HFF))
    x >>= 8
    b = CUShort((x And &HFF))
    x >>= 8
    a = CUShort((x And &HFF))
    y = S(0, a) + S(1, b)
    y = y Xor S(2, c)
    y = y + S(3, d)

    Return y
End Function

Может ли кто-нибудь помочь мне исправить эту функцию?


person user3760033    schedule 26.06.2014    source источник
comment
Каков код функции S?   -  person Ignacio Soler Garcia    schedule 26.06.2014
comment
функция S представляет собой двумерный массив целых чисел   -  person user3760033    schedule 26.06.2014
comment
Проверьте этот вопрос, поскольку он тесно связан с вашим: stackoverflow.com/questions/1874130/   -  person Ignacio Soler Garcia    schedule 26.06.2014
comment
но я не могу понять, что не так с кодом.   -  person user3760033    schedule 26.06.2014


Ответы (2)


Результат сложения двух целых чисел (Int32) должен быть сохранен в Int64, чтобы быть уверенным, что результат может быть сохранен без переполнения.

Итак, в этом случае ваш метод должен возвращать UInt64, а y также должен быть UInt64.

person Ignacio Soler Garcia    schedule 26.06.2014
comment
я пытаюсь сделать эту частную функцию F (ByVal x As UInteger) как UInt64 и затемнить как UInt64. но тем не менее, это все еще всплывает та же проблема - person user3760033; 26.06.2014
comment
Пожалуйста, добавьте детали исключения (сообщение, трассировка стека и т.д.) - person Ignacio Soler Garcia; 26.06.2014

Вы можете либо отключить проверку целочисленного переполнения (Дополнительно Диалоговое окно "Параметры компилятора" (Visual Basic)) или объявите y как UInt64, затем

Return CUInt(y And &HFFFFFFFF)
person Andrew Morton    schedule 26.06.2014
comment
я пробовал это, но нет никакой разницы между объявлением y как UInt64 или просто UInteger - person user3760033; 26.06.2014
comment
Если в S есть какие-либо значения, превышающие &H7FFFFFFF, вам нужно будет объявить S как массив целых чисел без знака. Каковы фактические значения из S, которые дают ошибку? - person Andrew Morton; 26.06.2014
comment
я объявил S как массив целых чисел - person user3760033; 26.06.2014