2016-01-22 5 views
0

Я создаю программу с функцией шифрования и дешифрования. Проблема в том, что он должен работать только с статической строкой кода. Он должен зацикливаться, когда входной текст является последним. Например, String является «ABCDE ... Z1234567890», когда я вводил 0, а ключ - 2, текст Cipher должен быть B. У меня есть четыре текстовых поля для ключа, ввода, открытого текста и зашифрованного текста. Вот мой код.Как закодировать конкретную строку Caesar Cipher vb10

Public Class Form1 
     Dim key As Integer 
Const Intext As String = "abcdefghijklmnopqrstuvwxyz1234567890" 
Private Sub btCipher_Click(sender As Object, e As EventArgs) Handles btCipher.Click 

    Dim plain, s, r As String 
    Dim i, j As Long 
    key = Val(txtKey.Text) 
    plain = txtInput.Text 
    For i = 1 To Len(plain) 
     r = Mid$(plain, i, 1) 
     j = (InStr(1, Intext, r)) 
     If key > 36 Then 
      s = s & Mid$(Intext, j + (key - 36), 1) 
     Else 
      s = s & Mid$(Intext, j + key, 1) 
     End If 

    Next i 

    txtResult.Text = s 
End Sub 

Private Sub btDecipher_Click(sender As Object, e As EventArgs) Handles btDecipher.Click 

    Dim plain, s, r As String 
    Dim i, j As Long 
    key = Val(txtKey.Text) 
    plain = txtResult.Text 
    For i = 1 To Len(plain) 
     r = Mid$(plain, i, 1) 
     j = (InStr(1, Intext, r)) 
     If key > 36 Then 
      s = s & Mid$(Intext, j + (key - 36), 1) 
     Else 
      s = s & Mid$(Intext, j - key, 1) 
     End If 
    Next i 

    txtText.Text = s 
End Sub End Class 

Моя проблема в том, что она не зацикливается. Может, кто-то может помочь. Спасибо.

+0

Является ли переменная 'key' числом символов, пропущенных в строке' Intext'? – Enigmativity

ответ

0

Я не уверен, почему ваш код не работает, но попробуйте этот код вместо:

Public Class Form1 

    Const Intext As String = "abcdefghijklmnopqrstuvwxyz1234567890" 

    Private Function Transcode(text As String, map As Dictionary(Of Char, Char)) As String 
     Return New String(text.Select(Function(x) If(map.ContainsKey(x), map(x), x)).ToArray()) 
    End Function 

    Private Sub btCipher_Click(sender As Object, e As EventArgs) Handles btCipher.Click 
     Dim key = Val(txtKey.Text) 
     Dim map = _ 
      Intext _ 
       .Zip(Intext.ToCharArray().Concat(Intext.ToCharArray()).Skip(key), Function(f, t) New With {f, t}) _ 
       .ToDictionary(Function(x) x.f, Function(x) x.t) 
     txtResult.Text = Transcode(txtInput.Text, map) 
    End Sub 

    Private Sub btDecipher_Click(sender As Object, e As EventArgs) Handles btDecipher.Click 
     Dim key = Val(txtKey.Text) 
     Dim map = _ 
      Intext _ 
       .Zip(Intext.ToCharArray().Concat(Intext.ToCharArray()).Skip(key), Function(f, t) New With {f, t}) _ 
       .ToDictionary(Function(x) x.t, Function(x) x.f) 
     txtText.Text = Transcode(txtResult.Text, map) 
    End Sub 

End Class 

Я проверил алгоритм и он работает отлично.

+0

Код работает для цикла, но кнопка расшифровки не работает? У меня есть четыре текстовых поля, и я видел три на вашем коде, как я могу расшифровать? Возможно, мы можем добавить текстовое поле к результату расшифровки. Спасибо. :) –

+0

@WarrenRazon - Я взял текстовые поля прямо из вашего вопроса. Возможно, вам придется проверить, нужно ли вам изменить любой из них в моем ответе, чтобы он работал. Вы также заметите, что вызовы '.ToDictionary (Function (x) xf, Function (x) xt) инвертируются по двум методам: один - это функция (x) xf, функция (x) xt', а другая 'Функция (x) xt, Функция (x) xf'. Это позволяет расшифровать движение назад. Поэтому я думаю, что вам просто нужно получить текстовые поля. – Enigmativity

+0

Хорошо, им жаль. Я пропустил имя, он работает сейчас. Но что, если мне нужно добавить новое текстовое поле наверху и стать ссылкой на строку? ** Const Intext As Double = txtString.Text ** - это мой код, который он не сработал, что мне делать? –