глюк с mod

Тема в разделе "WASM.WIN32", создана пользователем rodger, 24 май 2008.

  1. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    Добрый вечер всем. Недавно напоролся на глюк не знаю какого уровня. Нужно мне было реализовать тривиальное шифрование с использованием перестановки через mod
    Простейший случай выглядит так
    Private Sub Command1_Click()
    Dim a, b, c As Byte
    a = 250
    b = 240
    c = (a + b) Mod 255
    End Sub
    И работает.
    А я сделал чут более респектабельную штуку
    tmpByte = (SourceFile.Bits(i) + NextByte) Mod 255
    все переменные типа байт, SourceFile.Bits(i) - динамический масив ( с ним глюков нет, тестировал его с более тривиальными операциями). Когда запускаю свою строку выскакивает ошибка №6 - переполнение. Где собака зарыта. Пробовал деалать для tmpByte тип интеджер а потом конвертировать в байт - все равно падает. Как выкрутится?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    rodger
    ничего не понятно. но видимо дело в i
     
  3. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    rodger

    А что находится в NextByte?
     
  4. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    В этой переменной байт сгенерированный генератором (от 0 до 255), я отладчиком проверял, бряки ставил, все значения в пределах нормы (i, nextbyte,bits(i)), а результат операции все равно не получается. У меня эта команда в цикле, но падает после первого прогона при i=0. Масив нормальный, если использовать xor, то работает а mod - падает.
     
  5. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    rodger

    Выложи рабочий пример, который у тебя падает (проект целиком), тогда можно будет проверить. Кстати у тебя a и b в такой записи определены как Variant, а не Byte.
     
  6. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    Спасибо (тебе и всем другим неравнодушным) за желание ковырятся в чужих исходниках. Проблему решил. Дело в том что a,b вообще не нужны в этой программе и не используются вообще, я их просто написал в тестовом примере, и к главной программе они не имеют никакого отношения, но ты меня подтолкнул на правильную мысль, обьявить их локально в процедуре шифрования, а потом заменить ними мои стандарные переменные. Сделал так
    a = SourceFile.Bits(i)
    b = NextByte
    SourceFile.Bits(i) = (a + b) Mod 255
    А глюк был даже не с mod а при сложении байт, это я выяснил когда разделял операцию постройчно. Потом эксперементировал с типом переменной в которую буду заганять результат, дошел до тпа single, а толку - ноль.
    Теперь появился новый вопрос:если есть три алгоритмы шифрования
    1)SourceFile.Bits(i) = (a + b) Mod 255
    2)SourceFile.Bits(i) = ((a Xor b) + NextByte) Mod 255
    3)SourceFile.Bits(i) = ((a + b) Mod 255) Xor b
    то как их расшифровывать
    1)SourceFile.Bits(i) = (a - b) Mod 255 ?
    2)SourceFile.Bits(i) = ((a - b) Mod 255) Xor b ?
    3)SourceFile.Bits(i) = ((a Xor b) - b) Mod 255 ?
    ибо часто получается результат отрицательный, что протевоестественно для типа байт.
    По модуля брать или местами отдельные операции поменять?
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    1) всё-таки a = (SourceFile.Bits(i) + b) Mod 255, или опять SourceFile.Bits(i) вычислять надо?
     
  8. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Народ, вы с ума сошли, простите за прямоту :). Это же клинопись Бейсика!

    rodger
    Топай сюда. Отличный сайт про Бейсик.
     
  9. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Про "шифрование" все-таки еще отвечу :)

    Операция сложения по модулю, равно как и XOR, тривиально обратимы. Ты все расписал правильно, а отрицательный результат получается потому, что большинство языков программирования - VB не исключение - написаны людьми достаточно далекими от математики. И mod для отрицательных чисел обычно вычисляет что угодно, только не то, что должно. Придется самому исправлять (по типу -2 mod 5 = 5 - 2 = 3)
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Aquila
    ээ, пардон. просматривается нарушение логики и здравого смысла ;)
     
  11. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    t00x
    совершенно верно. Не клинопись, а некрономиконтовские каракули.
     
  12. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    "шифрованием" пиршлось занятся по заказу, сам знаю что это не серйозно но тем не менее. Выкручивался таким образом
    If a - b >= 0 Then
    SourceFile.Bits(i) = a - b
    Else
    SourceFile.Bits(i) = a + 255 - b
    End If
    и
    If (a Xor b) - b >= 0 Then
    SourceFile.Bits(i) = (a Xor b) - b
    Else
    SourceFile.Bits(i) = (a Xor b) + 255 - b
    End If
    других вариантов расшифровки не было, и то местами глючит, ладно разберусь.
    А если говорить про клинопись, и некро***, то господа бывают в жизни каждого моменты, когда хочется в отпуск, или просто ничего не далать, просто заматываешся и перестаеш понимать тривиальные вещи, а сроки поджимают, поэтому и спрашиваю в таком ключе. Я перед этим нарыл в нете несколько мегабайт инфы на эту тему сисходниками, но в таком состоянии анализ не пошел. Так что выкручиваюсь опытным путем. Всем удачи.
     
  13. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    Диагноз не совсем правильный, а за линк спасибо, я скачал три исходника по криптографии. А вообще Бейсик язык бажный.
     
  14. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Если спешишь и башка не о том думает, зачем с васиком связываться? Пиши на С или на фасме. Алгов - море. И уважение от людей.
    А насчет клинописи и каракулей, то тут на сайте банят за матершину от васика. Сейчас вот обсуждается вопрос, а не считать-ли дельфу матершиной?
    Вот-вот. Сами говорите. A зачем себя лажными языками унижать?

    ВАСМ - это солидно. Этим гордятся.
    васик - так, шпана. По подвалам дихлофос нюхает..
     
  15. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    С бейсиком связался не по своей воле, моя задача состояла в том гтобы закончить проэкт, написан лихо, процентов на 50 на API-шних функциях, только сыроватый чуток. Моя задача была наполнить его функциональностью + разобратся с глюками. Иногда приходится вообще на VBA программировать, под outlook, access, так это все равно что пластиковой вилкой окоп рыть, вроде гламурно, но очень жестоко, так приходится выворачиватся. А делфу матерщиной считать не стоит, она более стабильна нежели ВБ, + поддержка встроенного АСМ-а.