Моды и ASCII в VB Caesar Shift

У меня есть этот код, который сдвигает алфавит на определенную величину. Размер алфавита 26. Когда я ввожу сдвиг большего размера (например, 22), я получаю отображение некоторых странных символов. Я думаю, мне нужно модифицировать алфавит ASCII до 26, чтобы он заработал, но я не совсем уверен, какой бит модифицировать.

В основном мне нужно обернуть алфавит (как только он достигает Z, он возвращается к букве A). Нужно ли мне создавать словарь для работы мода (например, A = 0... Z = 26) или я могу придерживаться использования обычная таблица ASCII? Вот код ниже:

Public Function encrypt(ByVal input As String) 'input is a variable within the funcion
    Dim n as Integer
    Dim i As Integer
    n = key.Text Mod 26 'gets what is in the text box of 'key' and sets it as n
    ' the key is a multiple of 26 so 26 will  = 0

    'need to remove white spaces
    While input.Contains(" ")           'when the input text contains a space
        input = input.Replace(" ", "")  'replaces it with no space.
    End While


    For i = 1 To Len(input)                                     'find the length of the input
        Mid(input, i, 1) = Chr(Asc(Mid(input, i, 1)) + n)       'chr returns the character associated with the specified character code
        '
    Next
    encrypt = input
End Function

person K_McCormic    schedule 10.04.2012    source источник


Ответы (1)


Посмотрите на этот код:

For i = 1 To Len(input)                                     'find the length of the input
    Mid(input, i, 1) = Chr(Asc(Mid(input, i, 1)) + n)       'chr returns the character associated with the specified character code
    '
Next

Строковые индексы отсчитываются от 0. Ваш первый индекс равен 0, а не 1! Кроме того, вы присваиваете результат вызова функции. Вместо этого вам нужно создать новую строку.

Вы не сказали, но то, как вы использовали методы «Заменить» и «Содержит», указывает на .Net, и если это так, я бы сделал это так:

Public Function encrypt(ByVal key As Integer, ByVal input As String) As String 'Don't forget the return type on the function
    key = key Mod 26
    Return New String(input.Replace(" ", "").ToUpper().Select(Function(c) Chr(((Asc(c) + key - Asc("A"c)) Mod 26) + Asc("A"c))).ToArray())
End Function

Просто так, и это почти однострочник. Теперь я вижу, как это работает, назвав это так:

Encrypt("C"c, "the quick brown fox jumps over the lazy dog")
Encrypt("D"c, "the quick brown fox jumps over the lazy dog")

Результаты, достижения:

BPMYCQKSJZWEVNWFRCUXMLWDMZBPMTIHGLWOA
CQNZDRLTKAXFWOXGSDVYNMXENACQNUJIHMXPB

Найдите результаты, сопоставленные со словом «ленивый», и вы увидите, что «а» правильно переносится на «z» и «y», и что результаты ключа «D» на одну букву меньше результатов «C». .

person Joel Coehoorn    schedule 10.04.2012
comment
Что касается вашего комментария об индексах, отсчитываемых от нуля, Mid использует индекс, отсчитываемый от 1, так что в любом случае цикл был в порядке. - person Timiz0r; 10.04.2012
comment
Спасибо за быстрый ответ. Извините за глупые вопросы, я еще новичок в этом языке. Я не совсем уверен, что делает код и как он работает, и я очень запутался. Я попытался заменить свой код на ваш, и, похоже, он ничего не конвертирует. Как я могу заставить его обернуться (например, буква Z со сдвигом 3 вернется к букве C)? - person K_McCormic; 11.04.2012
comment
@K_McCormic У меня была опечатка: символ = вместо плюса (неправильная клавиша Shift). У меня также нет под рукой компилятора, поэтому он еще не протестирован, но теперь должен быть хотя бы немного ближе. - person Joel Coehoorn; 11.04.2012
comment
Я все еще очень смущен :( Все, что я вижу, это синие линии, и я не совсем уверен, что что-то делает. Извините, что потратил ваше время :( - person K_McCormic; 11.04.2012
comment
Попробуйте прямо сейчас: просто нужно исправить круглые скобки... теперь это достаточно просто, когда я нахожусь за компьютером с визуальной студией, чтобы помочь мне определить это. - person Joel Coehoorn; 11.04.2012
comment
О, хорошо, я думаю, что теперь я понимаю это немного лучше. Если бы я заменил ключ числом, скажем, 3 вместо C, я просто установил бы его как целое число? - person K_McCormic; 11.04.2012
comment
Да, это было бы нормально. Я использовал тип Char для ключа, потому что он соответствовал исходному коду. - person Joel Coehoorn; 11.04.2012
comment
Извините, что беспокою вас снова. Это может показаться очень глупым вопросом... Но какой бит вы заменяете, чтобы вместо буквы была цифровая клавиша? (скажем 3 вместо C) Еще раз спасибо за помощь - person K_McCormic; 12.04.2012
comment
Отредактировал ответ, чтобы использовать целочисленный ключ - person Joel Coehoorn; 12.04.2012
comment
При вводе клавиши 3 кажется, что весь алфавит сдвигается на 15 позиций вместо 3. ps. вы были зачислены в код :) - person K_McCormic; 12.04.2012
comment
Тогда еще один раунд. Приведите строку к верхнему регистру и вычтите значение A перед переносом текста. - person Joel Coehoorn; 12.04.2012
comment
Большое спасибо за помощь :) - person K_McCormic; 12.04.2012