0

我正在寻找一种将输入文本编码为 Rot13 的简单方法。在能够将单词分离为单个字符和整数的阶段,我遇到了障碍,以便我可以更改每个字符并输出结果。我可以使用下面列出的简单 if 语句用单个字母来完成,但如果有人能帮助我用一种方法来处理整个单词,我将非常感激。

If kInput = "a" then kOutput = "n"

谢谢,凯

4

3 回答 3

2

看起来你让这种方式变得比它必须的更难。无需分隔单词等,绝对不需要大的 If/Else 块:

Public Function Rot13(ByVal input As String) As String
    Dim result As Char() = input.ToCharArray()

    For i As Integer = 0 To result.Length - 1
        Dim temp As Integer = Asc(result(i))
        Select Case temp
           Case 65 to 77, 97 To 109 'A - M
               result(i) = Chr(temp + 13)
           Case 78 to 90, 110 To 122 'N - Z
               result(i) = Chr(temp - 13)
        End Select
    Next i

    Return New String(result)
End Function

请注意,这是直接输入到浏览器窗口中的,并且完全未经测试。

于 2012-10-22T18:02:12.957 回答
2

看起来人们对此给出了很好的答案,但这是我的尝试。

Dim input As String = "This is a Test!! Guvf vf n Grfg!!"
Dim result As StringBuilder = New StringBuilder()

For Each ch As Char In input

    If (Not Char.IsLetter(ch)) Then
        result.Append(ch)
        Continue For
    End If

    Dim checkIndex As Integer = Asc("a") - (Char.IsUpper(ch) * -32)
    Dim index As Integer = ((Asc(ch) - checkIndex) + 13) Mod 26

    result.Append(Chr(index + checkIndex))

Next

Console.WriteLine(result.ToString())

编辑:改进以消除对大写检查的需要。这将正确处理循环内只有 1 个 if 语句的大小写和特殊字符。

于 2012-10-22T18:17:37.387 回答
0

调用一次编码,再次调用解码。

Private Function ROT13_Encode(ByVal Input As String) As String
Dim chrs As Char() = Input.ToCharArray()
Dim ReturnString As String = ""
Dim CharInt As Integer

For Each Chr As Char In chrs
    CharInt = Asc(Chr)
    If CharInt >= 65 And CharInt <= 77 Then 'A-M
        CharInt += 13
    ElseIf CharInt >= 78 And CharInt <= 90 Then 'M-Z
        CharInt -= 13
    ElseIf CharInt >= 97 And CharInt <= 109 Then 'a-m
        CharInt += 13
    ElseIf CharInt >= 110 And CharInt <= 122 Then 'm-z
        CharInt -= 13
    End If
    ReturnString &= ChrW(CharInt)

Next

Return ReturnString
End Function
于 2012-10-22T18:04:11.447 回答