Buchstaben verändern C#?

5 Antworten

Die Replace-Methode hast du ja bereits entdeckt.

Zum Verschlüsseln könntest du aber auch folgendermaßen vorgehen: Du legst dir ein Array an Zahlen an, welches so viele Elemente hat, wie es Zeichen gibt, die verschlüsselt werden sollen. Jedes Element merkt sich seine Verschiebung im Alphabet / ASCII-Code.

Im Folgenden läufst du zum Ent-/Verschlüsseln via Schleife durch den zu bearbeitenden String. Je Iteration holst du dir nun für das aktuelle Zeichen (char) die Verschiebung und ermittelst das neue Zeichen.

Zuvor solltest du dich noch mit der Beziehung char - int beschäftigen.

char a = 97; // = 'a'

Schau dir dazu die oben verlinkte ASCII-Tabelle an.

Danke für all die Guten Ratschläge das mit den Character-Array find ich schon Interessant hab mir auch dazu etwas angesehen aber laut meinen Infos ist das mehr fürs Entschlüsseln.

Aber die ASCII Variante finde ich ganz gut und werde mich darüber einmal mehr Informieren.

Wie 2 Leute schon geschrieben haben ist das mit dem String = String.Replace ganz gut, zwar glaube ich aufwendiger zu schreiben und sieht nicht so schön aus aber klappt fürs erste, wie gesagt schaue ich mal wegen ASCII,

Bild zum Beitrag

Danke an Alle!

 - (Computer, programmieren, C Sharp)

regex9  24.07.2019, 13:58
(...) aber laut meinen Infos (...)

Die Umwandlung des Strings in ein char-Array vereinfacht dir die Bearbeitung des gegebenen Worts. Was du damit machst - ob du die Zeichen verdrehst, löschst, verschlüsselst, entschlüsselst, steht in keiner Abhängigkeit dazu.

1

Das Problem liegt darin, dass Strings in C# nicht veränderbar sind.

Bedeutet: Die Methode Replace ändert nicht den String sondern "baut" einen neuen String zusammen, in dem die entsprechenden Ersetzungen vorgenommen sind.

Lösung für deinen Anwendungsfall:

Verschlüssler = Verschlüssler.Replace('A', 'Z');

usw.


Isendrak  24.07.2019, 15:01

Als Nachtrag noch zum Thema "Char-Array" zwei Beispielimplementierungen:

using System;
public class EinfacheStringVerschlüsselungen{
    public static string Vigenere(string Nachricht, string Schlüssel, bool Verschlüsseln = true){
        char[] _Nachricht = Nachricht.ToCharArray(), _Schlüssel = Schlüssel.ToUpper().ToCharArray();
        for(int i = 0, j = 0; i < _Nachricht.Length; ++i, j = i % _Schlüssel.Length){
            if(_Nachricht[i] >= 'A' && _Nachricht[i] <= 'Z')
                _Nachricht[i] = (char)(((((_Nachricht[i] - 'A') + (Verschlüsseln ? 1 : -1) * (_Schlüssel[j] - 'A')) + 26) % 26) + 'A');
            else if(_Nachricht[i] >= 'a' && _Nachricht[i] <= 'z')
                _Nachricht[i] = (char)(((((_Nachricht[i] - 'a') + (Verschlüsseln ? 1 : -1) * (_Schlüssel[j] - 'A')) + 26) % 26) + 'a');
        }
        return new string(_Nachricht);
    }
    
    public static string Caesar(string Nachricht, int Verschiebung){
        char[] _Nachricht = Nachricht.ToCharArray();
        for(int i = 0; i < _Nachricht.Length; ++i){
            if(_Nachricht[i] >= 'A' && _Nachricht[i] <= 'Z')
                _Nachricht[i] = (char)((((_Nachricht[i] - 'A') + Verschiebung) % 26) + 'A');
            else if(_Nachricht[i] >= 'a' && _Nachricht[i] <= 'z')
                _Nachricht[i] = (char)((((_Nachricht[i] - 'a') + Verschiebung) % 26) + 'a');
        }
        return new string(_Nachricht);
    }
}
0

Also im normalfall macht man sowas indem man den aktuellen buchstaben zu int castet und dann eine bestimmte summe addiert (oder andere verfahren um es zu einem anderen buchstaben zu ändern) und dann wieder zurück zu char castet. also in etwa so:

char c = 'a';
((int)c) += 5;

keine ahnung ob das richtige c# syntax ist aber so funktioniert das in der theorie. ein char ist ja auch nur eine zahl (hier mal eine ascii tablle https://slideplayer.com/slide/5880154/19/images/2/ASCII+Table.jpg)

Woher ich das weiß:Studium / Ausbildung – Softwareentwickler, B. Sc. Informatik

Also ein Substitutionsalphabet.

Wenn string1 ein String ist, ändert String.Replace() das String string1 selbst nicht, sondern gibt ein verändertes String als Funktionsergebnis zurück. Ebenso liefert Console.ReadLine() das vom Benutzer eingegebene String als Funktionsergebnis zurück.

Bei mehrfachen Ersetzungen werden auch bereits ersetzte Elemente ersetzt - die Replace-Funktion kann ja nicht wissen, was vorher passiert ist. Was steht z. B. nach Ausführung folgenden Programmabschnitts in der Variablen string1?

String string1 = "abc";
string1 = string1.Replace('a', 'b');
string1 = string1.Replace('b', 'c');
string1 = string1.Replace('c', 'd');

Besser wäre also, das String in ein Character-Array umzuwandeln, das Character-Array zu bearbeiten und zuletzt das Character-Array wieder in ein String umzuwandeln.

Woher ich das weiß:Berufserfahrung – Software-Entwickler