这是一个简单的实用程序,用于在需要时在桌面上进行简单的ROT13编码和解码。
我习惯于使用VBA进行编码,并且对更多的.Net惯用编码风格感兴趣。
Public Class Rot13Decoder
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles txtRotEntry.TextChanged
lblResult.Text = Rot13(txtRotEntry.Text)
End Sub
Function Rot13(Source As String) As String
Dim i As Long
Dim result As String = ""
For i = 0 To Source.Length - 1
Dim myChar As Char
myChar = Source.Substring(i, 1)
Select Case myChar ' originally used Asc(Source(i)), hence the integers below
Case "a" To "m", "A" To "M" '65 To 77, 97 To 109
result &= Chr(Asc(myChar) + 13) 'Chr(Asc(Source(i)) + 13)
Case "n" To "z", "N" To "Z" '78 To 90, 110 To 122
result &= Chr(Asc(myChar) - 13) 'Chr(Asc(Source(i)) - 13)
Case Else
result &= myChar
End Select
Next
Return result
End Function
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
End Sub
End Class
(表单的标题是译码器,我在示例中使用它来编码!)
双击表单结果标签将文本复制到剪贴板以供使用。
发布于 2019-07-17 05:05:29
这里的第一个问题是,您一次将翻译好的字母连到字符串上。由于字符串在.NET (和大多数正确的思维语言)中是不可变的,这意味着对于第一个已翻译的字符,您的程序为长度为1的新字符串分配空间(复制前一个0-char字符串),为第二个字符分配空间,为长度为2的新字符串分配空间(复制前一个1-char字符串),为第三个字符分配空间,为长度为3的新字符串分配空间(复制前一个2-char字符串)等等。最终的结果是,对于输入n个字符,程序将分配1+2+3+.+n= O(n^2)空间,类似地,执行O(n^2)操作!一个更好的结构是使用.NET StringBuilder,它正是为这种零碎的字符串结构而设计的。使用StringBuilder,您的程序将分配O(n)空间并执行O(n)操作--当输入长度为任何非平凡长度时,这是一个很大的节省。
发布于 2019-07-17 05:49:59
您的方法的一个问题是,它不能很好地扩展。如果你想要不同的旋转因子,甚至是一个完整的凯撒赛弗,你将不得不完全重写你的代码。基于数学的方法(Mod 26)可以允许任何旋转因子,在合理的范围内。
另一种允许O(n)空间的方法是将字符串转换为char数组并改变字符位置。
它可能看起来像这样:
Public Function ROT13(input As String) As String
Dim chars = input.ToArray()
Const UpperA As Integer = Asc("A"c)
Const LowerA As Integer = Asc("a"c)
For i = 0 To chars.Length - 1
If Char.IsLetter(chars(i)) Then
If Char.IsUpper(chars(i)) Then
chars(i) = Chr((((Asc(chars(i)) - UpperA) + 13) Mod 26) + UpperA)
Else
chars(i) = Chr((((Asc(chars(i)) - LowerA) + 13) Mod 26) + LowerA)
End If
End If
Next
Return New String(chars)
End Function我把旋转因子硬编码为13,但是在函数中添加一个旋转参数应该是一个简单的事情。
https://codereview.stackexchange.com/questions/224319
复制相似问题