C# Caesarverschlüsselung programmieren?
Hallo alle zusammen,
ich habe ein Programm (C#) in der Berufsschule entworfen, um einen bzw. mehrere Buchstaben /Wörter in einen verschlüsselten Text, per Caesarverschiebung um zwei Stellen, umzuwandeln.
Allerdings zeigt er mir immer die zwei Fehler an, dass int nicht in char konvertiert werden könne. Wo allerdings der Fehler liegt bin ich gerade ratlos. Er verweist halt immer auf den Originalbuchstaben (unverschlüsselter Text aus der Eingabe, der verschlüsselt werden soll) und den verschlüsselten Buchstaben.
Hat jemand eine Ahnung wie man die beiden Fehler löst? Wäre super :)
VG Sascha
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bitte geben sie den zu verschlüsselnden Buchstaben ein:");
char originalbuchstabe = Convert.ToChar(Console.ReadLine());
Console.WriteLine("Der verschlüsselte Buchstabe lautet: {0}", Verschlüsseln('a', 3, 25)); //{0} <---Platzhalter
Console.ReadKey();
Console.WriteLine("Bitte geben sie den zu entschlüsselnden Buchstaben ein:");
int Verschlüsselter_Buchstabe = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Der entschlüsselte Buchstabe lautet: {0}", Entschlüsseln('a', 3));
Console.ReadKey();
}
static char Verschlüsseln(char originalbuchstabe, int offset, int n = 25)
{
char Verschlüsselter_Buchstabe = (originalbuchstabe + offset);
return Verschlüsselter_Buchstabe;
}
static char Entschlüsseln(char Verschlüsselter_Buchstabe, int offset = 2, int n = 25)
{
char Entschlüsselter_Buchstabe = (Verschlüsselter_Buchstabe - offset);
return Entschlüsselter_Buchstabe;
}
}
}
4 Antworten
Naja, du rechnest doch
char Verschlüsselter_Buchstabe = (originalbuchstabe + offset);
und das obwohl "originalbuchstabe" ein char ist.
Du musst char erst in int konvertieren, darauf addieren, und abschließend wieder int in char.
Das geht so
char a = 'a';
int x = (int)a;
x+=2;
char c = (char)x;
Liebe Grüße
_
naja, die Fehlermeldung sagt eigentlich schon alles: 'char irgendwas = 25' geht genau so wenig wie 'int irgendwas = 't' '.
Du brauchst sowas: https://stackoverflow.com/a/3414944
Nur ein Hinweis: So läuft der Cäsar-Code nicht. Die Codierung von "Z" ist nämlich "B" und nicht '\' (Der Offset bei Cäsar ist immer 3).
itSo funktioniert das jedenfalls sicher nicht.
Du versuchst einen char mit einem int zu addieren. Das funktioniert natürlich nicht.
Außerdem wird durch diesen Algorithmus nicht sichergestellt, das der verschlüsselte Buchstabe weiterhin im Bereich des Alphabets befindlich ist.
Wird bei der Addition des Offsets der 26. Buchstabe überschritten, muss wieder bei "A" begonnen werden.
Der Algorithmus für die Verschlüsselung eines chars sieht demnach wie folgt aus:
int buchstabe = Convert.ToInt32(<char>);
buchstabe -= 65; //für Kleinbuchstaben 97 einsetzen
buchstabe += offset;
buchstabe %= 26;
buchstabe += 65;
<char> = (char)buchstabe;
Im Unicode hat "A" die 65, wenn man das Zeichen also in einen int konvertiert erhält man diese Zahl.
Damit es bei der Modulo-Operation nicht zu einem Fehler kommt muss diese zunächst subtrahiert und anschließend wieder addiert werden.
Für Kleinbuchstaben wäre dies die 97.
Lässt man diesen Schritt weg, kann man Zeichen erhalten, welche bei einer weiteren Verarbeitung/Ausgabe Probleme bereiten.