2017-09-21 9 views
0

J'essaye d'émuler le cryptage César Cipher. Le problème est que chaque fois que j'ai entré "wxyz"
(décalé de 3) la sortie est "z {|}". Mais la sortie attendue devrait être "zabc".VB - Emulation César Cipher

Quelqu'un sait quoi ajouter?

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
      Dim plaintext As String = TextBox1.Text 
      Dim charArray() As Char = plaintext.ToCharArray 
      Dim shift = TextBox2.Text 
      Dim character As String 
      Dim temp As String 
      TextBox3.Text = "" 



      If shift <> "" And IsNumeric(shift) Then 
       If plaintext = "" Then 
        MsgBox("Please input some plain text") 
        Exit Sub 
       End If 
       If shift > 26 Then 
        MsgBox("Maximum shifts reached. Limit is 26!!") 
        Exit Sub 
       End If 
       For loope = 0 To charArray.Length - 1 Step +1 
        temp = charArray(loope) 

        character = Chr(Asc(temp) + shift) 

        TextBox3.Text += character 


       Next 
       Exit Sub 
      Else 
       MsgBox("Input numbers only!!") 
      End If 


     End Sub 
+0

Quel beau travail :-) – muffi

+0

En fait, c'est notre projet de mi-parcours :-) –

Répondre

0

Lorsque vous passez un code Ascii vous devez vérifier qu'il ne soit pas supérieur à 122, qui est le code Ascii du caractère « z ». Si vous allez au-delà de ce point, vous obtiendrez des signes de ponctuation, des symboles et tout ça. Google "Table ASCII" et vous pouvez facilement le voir par vous-même. Donc, pour résoudre votre problème, si le code Ascii que vous obtenez après le décalage est supérieur à 122, vous devriez revenir en arrière et recommencer par 97, ce qui est l'ascii pour "a".

Ainsi, au lieu de ceci:

  For loope = 0 To charArray.Length - 1 Step +1 
       temp = charArray(loope) 
       character = Chr(Asc(temp) + shift) 
       TextBox3.Text += character 
      Next 

Vous devriez faire quelque chose comme

  For loope = 0 To charArray.Length - 1 Step +1 
       temp = charArray(loope) 
       character = Chr(Asc(temp) + shift) 
       ' You substract 26, the whole length of the alphabet 
       If character > 122 Then 
        character = character - 26 
       End If 
       TextBox3.Text += character 
      Next 

Pas tout à fait sûr que ce serait stable si shift est supérieur à 26, mais de toute façon vous vérifiez déjà son valeur donc ça devrait marcher.

+0

Qu'en est-il des lettres majuscules? – fofik

+1

Les majuscules ont différents codes ascii. Ils vont de 65 à 90. Vous devez appliquer le même concept mais dans un intervalle différent. Si vous voulez avoir des lettres majuscules et minuscules sur votre message, avant de passer, vous devriez vérifier si le caractère d'origine est inférieur ou supérieur, et ensuite contrôler que le résultat ne soit pas supérieur à 90 (supérieur) ou 122 (inférieur). D'un autre côté, si le cas de message ne vous dérange pas, vous pouvez utiliser ToUpper() ou ToLower() pour transformer l'intégralité du message initialement, puis gérer un seul intervalle. – Alicia

+0

"Conversion de chaîne" z {|} "en type entier non valide." Mais je l'ai eu à travailler de toute façon. Le seul problème avec lequel je travaille maintenant est la majuscule. Je vais essayer votre suggestion :) Merci :-) –