首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ROT13编解码器

ROT13编解码器
EN

Code Review用户
提问于 2019-07-17 04:04:37
回答 2查看 1.4K关注 0票数 8

这是一个简单的实用程序,用于在需要时在桌面上进行简单的ROT13编码和解码。

我习惯于使用VBA进行编码,并且对更多的.Net惯用编码风格感兴趣。

代码语言:javascript
复制
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

(表单的标题是译码器,我在示例中使用它来编码!)

双击表单结果标签将文本复制到剪贴板以供使用。

EN

回答 2

Code Review用户

回答已采纳

发布于 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)操作--当输入长度为任何非平凡长度时,这是一个很大的节省。

票数 8
EN

Code Review用户

发布于 2019-07-17 05:49:59

您的方法的一个问题是,它不能很好地扩展。如果你想要不同的旋转因子,甚至是一个完整的凯撒赛弗,你将不得不完全重写你的代码。基于数学的方法(Mod 26)可以允许任何旋转因子,在合理的范围内。

另一种允许O(n)空间的方法是将字符串转换为char数组并改变字符位置。

它可能看起来像这样:

代码语言:javascript
复制
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,但是在函数中添加一个旋转参数应该是一个简单的事情。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/224319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档