2012-04-10 2 views
1

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

В принципе, мне нужно обернуть вокруг алфавита (как только он дойдет до 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 

ответ

3

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

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! Кроме того, вы назначаете результат вызова функции. Вместо этого вам нужно построить новую строку.

Вы не сказали, но так, как вы использовали Replace и содержит методы указывает на .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».

+1

Что касается вашего комментария о нулевых индексах, 'Mid' использует индекс на основе 1, так что цикл был в порядке, во всяком случае. – Timiz0r

+0

Спасибо за быстрый ответ. Извините за глупые вопросы, я до сих пор довольно новичок в этом языке. Я не совсем уверен, что делает код и как он работает, и я очень смутился. Я попытался заменить свой код на ваш, и он, похоже, ничего не конвертирует. Как я мог заставить его обернуться (например, буква Z со сдвигом 3 вернется к букве C)? –

+0

@K_McCormic У меня была опечатка: an = символ вместо плюса (bad shift key). У меня также нет компилятора, поэтому он все еще не проверен, но должен быть по крайней мере немного ближе. –