Caesar Entschlüsselungsprogramm

Nummer11

Mitglied
Ich schreibe gerade ein Programm, dass eine vom Caesar-Verschlüsselungssystem verschlüsselte Datei bekommt und diese automatisch selber entschlüsselt. Die Schlüsselzahl ist dabei am Anfang nicht dabei, das Programm muss diesen also selber finden.
Ich hab den Programm Code fertig, jedoch ist es irgendwie nicht in der Lage den Schlüssel zu finde und ich verstehe einfach nicht warum.
Der Fehler liegt irgendwo zwischen Zeile 48 und 66, weil die Variable
char amOftestenVorkommenderChar = ' ';, die ich global deklariert habe, nicht verändert aus der for-Schleife rauskommt. Ich verstehe aber nicht warum...
Ich hoffe jemand kann mir weiter helfen, sitze schon 2 Stunden vor dem Code und versuche den Fehler zu finden...
Der Code ist etwas lang, also wie gesagt: Das Problem liegt denke ich zwischen Zeile 48 und 66 (Bei den zwei for-Schleifen).
Habe auch Kommentare dazu geschrieben, damit es vllt etwas einfacher nachzuvollziehen ist.


Java:
import java.io.*;

public class Decode {
    public static void main(String[] args) {

        /*Programm soll nun ausgeführt werden,
          wenn die Namend er zu entschlüsselnden Datei
          und der neuen entschlüsselten Datei drinnen sind*/
       
        if (args.length == 2) {
            File verschlüsselteDatei = new File(args[0]);
            File entschlüsselteDatei = new File(args[1]);

            try {
                FileReader lesen = new FileReader(verschlüsselteDatei);
                FileWriter schreiben = new FileWriter(entschlüsselteDatei);

                int gelesenerChar = lesen.read();
                int gelesenerChar2 = gelesenerChar;
                int anzahlDerZeichen = 0;

                /*
                 * anzahl der zeivhen in der datei, damit ich weiss, wie gross
                 * ich später das array machen muss, wo ich dann den text aus der datei reinkopiere
                 */
                while (gelesenerChar2 != -1) {
                    anzahlDerZeichen++;
                    gelesenerChar2 = lesen.read();
                    ;
                }

                System.out.println("Anzahl der Zeichen der Datei: " + anzahlDerZeichen);

                char[] buffer = new char[anzahlDerZeichen];

                // die datei wird in das char array buffer gespeichert/kopiert
                while (gelesenerChar != -1) {
                    lesen.read(buffer);
                    gelesenerChar = lesen.read();
                }

                int current = 0;
                /*
                 * //Eig. wollte ich die Variable "amOftestenVorkommenderChar" nur deklarieren aber das geht nicht
                 * weil, ich dann später in Zeile 48 ein Fehler bekomme.
                 * Deswegen als "Platzhalter" irgendein char reingeschrieben, da
                 * es in der if bdeingung später eh verändert werden MÜSSTE
                 */
                char amOftestenVorkommenderChar = ' ';

                //Hie soll der am am öftesten vorkommende char gefunden werden
                for (int i = 0; i < buffer.length; i++) { //
                    int buchstabenVorkommensCounter = 0;
                    for (int j = 1; j < buffer.length; j++) {
                        if (buffer[i] == buffer[j]) {
                            buchstabenVorkommensCounter++;
                        }
                    }

                    if (buchstabenVorkommensCounter > current) {
                        current = buchstabenVorkommensCounter;
                        amOftestenVorkommenderChar = buffer[i];
                        System.out.println("buffer[i] ist: " + buffer[i]);
                        System.out.println("Am oftesten vorkommender Char ist: " + amOftestenVorkommenderChar);
                    }
                }
               
                //Hier soll letztendlich der Die Textdatei entschlüsselt und in eine neue Datei gespeichert werden
                System.out.println("current " + current);
                int schlüssel = 'e' - amOftestenVorkommenderChar;
                System.out.println("Schlüssel is: " + (char) schlüssel);
                for (int i = 0; i < buffer.length; i++) {
                    schreiben.write((char) (buffer[i] + schlüssel));
                }

                lesen.close();
                schreiben.close();

            } catch (FileNotFoundException e) {
                System.out.println("Die Datei konnte nicht gefunden werden ");
            } catch (IOException e) {
                System.out.println("Es ist ein Fehler beim Lesen oder Schreiben der Date aufgetreten ");
            }

        } else {
            System.err.println("Das args Array beinhaltet nicht die zwei benötigten Elemente ");
        }

    }

}
 

Joose

Top Contributor
Was sagt denn deine Konsole? Wird dort ausgegeben welcher Char am öftesten vorkommt?
Kann es sein das der öfterste ' ' (blank) ist?
 

Nummer11

Mitglied
Ja genau, die Konsole sagt dass amOftestenVorkommenderChar (blank) ist ABER wenn ich die Variable ganz am Anfang als z.B 'a' initialisiere gibt die Konsole immer noch (blank) aus.
Was auch komisch ist: Eig müsste die Konsole ja mehr als nur einmal buffer und amOftestenVorkommenderChar ausgeben, weil sich die print-Anweisung ja in der for-Schleife befinden und bei jedem neuen Durchlauf, bei dem die die if-Bedingung dann wieder zutrifft, müssten auf der Konsole die besagten Zahlen noch mal geprintet werden. Das passiert aber nicht.

Vllt interpretiere ich das falsch aber das könnte heissen, dass vllt etwas mit der for Schleife nicht ganz stimmt?
 

Joose

Top Contributor
Schon mal daran gedacht das ' ' (blank) der häufigste char ist? ;)
Leider können wir nichts über den Text sagen den du da analysierst. Bau dir doch mal mehr Konsolenausgaben ein ... zum Beispiel welchen Buchstaben er gerade analysiert.
Wird dein File korrekt eingelesen? Ist das Array "buffer" korrekt befüllt?
 

JStein52

Top Contributor
Ich würde ja mal mit dem Debugger einen Haltepunkt auf die Zuweisung setzen und gucken was da so reingeschrieben wird. Und dann mit einer Mini-Datei testen
 

Nummer11

Mitglied
Also ich weiss leider nicht wie man mit dem Debugger umgeht.
Aber der buffer array ist komischeerweise nur mit leerzeichen befüllt. ABer ich verstehe nicht warum?

Ich habe mal versucht die while-Schleife die den text in das array kopieren sollte einfach durch lesen.read(buffer); zu ersetzen, weil mir das sinvoller erschien als die schleife. Mit dem neuen Befehl wird ja im Prinzip der Datenstrom der gelesen wird in das Array gespeichert, oder?
 

Joose

Top Contributor
Ich habe mal versucht die while-Schleife die den text in das array kopieren sollte einfach durch lesen.read(buffer); zu ersetzen, weil mir das sinvoller erschien als die schleife. Mit dem neuen Befehl wird ja im Prinzip der Datenstrom der gelesen wird in das Array gespeichert, oder?
Schau einfach in die Dokumentation ;)
https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html#read(char[])

In deiner 1.while Schleife liest du bereits dein ganzen File ein, in der 2.while Schleife kann er somit nichts mehr lesen und das char-Array bleibt entsprechend mit ' ' gefüllt.
 

JStein52

Top Contributor
Also wenn ich das richtig sehe liest du die Datei zeichenweise ein um zu sehen wieviele Zeichen darin sind ? Und am Ende machst du nochmal ein Read um die Datei ganz zu lesen ?? Aber dann bist du doch schon am Ende der Date
 

Nummer11

Mitglied
Ahh, das war der Fehler :)
Ich habe den Stream nun an entsprechender Stelle einmal geschlossen und nochmal aufgemacht, damit ich ihn von vorne lesen kann. Bei dem Entschlüsselungsprozess am Ende hat es bei dem Code auch noch Probleme gegeben aber das habe ich noch selber hinbekommen.
Danke euch beiden :)
 

JStein52

Top Contributor
du weisst aber schon dass du die Länge der Datei auch mit
Code:
verschlüsselteDatei.length()
kriegst
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Feststellen, dass Wert zu groß; Caesar Chiffre Java Basics - Anfänger-Themen 3
T Fehler in Caesar-Chiffre Java Basics - Anfänger-Themen 7
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
M Caesar Chiffre Java Basics - Anfänger-Themen 3
Y Caesar Verschlüsselung Fehler Java Basics - Anfänger-Themen 4
N Caesar Verschlüsselung Java Basics - Anfänger-Themen 2
J Erste Schritte Caesar - Code Verbesserung Java Basics - Anfänger-Themen 2
K Caesar Verschlüsselng Java Basics - Anfänger-Themen 18
S Caesar Verschlüsselung Start Hilfe Java Basics - Anfänger-Themen 4
H Caesar-Verschlüsselung - Was stimmt nicht? Java Basics - Anfänger-Themen 6
J Caesar Ciphers funktioniert nicht Java Basics - Anfänger-Themen 3
S Caesar-Verschlüsselung Problem/Frage Java Basics - Anfänger-Themen 4
B Textentschlüsselung nach Caesar Java Basics - Anfänger-Themen 3
M Caesar Encrypt+Decrypt Java Basics - Anfänger-Themen 3
K Caesar-chiffre Java Basics - Anfänger-Themen 5
F Nachrichtenverschlüsselung nach Caesar: Java Basics - Anfänger-Themen 4
C weniger code für: caesar + reverse? Java Basics - Anfänger-Themen 8
P Caesar Ver- und Entschlüsselung Java Basics - Anfänger-Themen 1
D Caesar Chiffre Java Basics - Anfänger-Themen 2
L Caesar-Verschlüsselung programmieren Java Basics - Anfänger-Themen 12
G Caesar-Chiffre Java Basics - Anfänger-Themen 7
M Entschlüsselungsproblem (Caesar) Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben