1

我有这个代码可以将字母表移动一定量。字母表的大小是 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
4

1 回答 1

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 和 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

查找为单词“lazy”映射的结果,您将看到“a”正确地换行为“z”和“y”,并且“D”键结果是“C”结果的一个字母.

于 2012-04-10T15:58:24.117 回答