VB Caesar Shift中的Mods和ASCII

时间:2012-04-10 13:00:14

标签: vb.net ascii modulo

我有这个代码将字母表移动了一定量。字母表的大小是26.当我输入一个更大的大小的班次(例如22)时,我会看到一些奇怪的字符。我想我需要将ASCII字母表修改为26以使其工作但我不太确定要修改哪个位。

基本上我需要环绕字母表(一旦它到达Z它又回到字母A)我是否必须为mod工作创建一个字典(如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

1 个答案:

答案 0 :(得分: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-based 。你的第一个索引是0,而不是1!此外,您将分配函数调用的结果。您需要构建一个新字符串。

您没有说,但是您使用Replace和Contains方法的方式表示.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

查找为“懒惰”这个单词映射的结果,你会发现'a'正确包装到'z'和'y',并且'D'键的结果是'a'的一个字母。 C'结果。