我有这个代码将字母表移动了一定量。字母表的大小是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
答案 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'结果。