Commit 0d0862d9 authored by Flori N's avatar Flori N

Doku & Code Conventionen Walze, Reflektor, Morsecode, Codebuch

parent 2f893d6d
......@@ -7,18 +7,18 @@ import java.time.ZoneId;
/**
* Das Codebuch war eines der essentiel wichtigen Sachen bei der Enigma.
* Jeder Enigma gehörte auch ein Codebuch bei, welches notwendig war um die Nachrichten zu ver/entschlüsseln.
* Jeder Enigma gehoerte auch ein Codebuch bei, welches notwendig war um die Nachrichten zu ver/entschluesseln.
* Im Codebuch standen für jeden Tag des Monats die notwendigen Einstellungen welche vorgenommen werden
* mussten um die Texte zu ver/entschlüsseln.
* Hiernach wurden die Walzen eingesetzt, die Ringe für den Rücksprung der Walze gesetzt und deren Grundeinstellung
* mussten um die Texte zu ver/entschluesseln.
* Hiernach wurden die Walzen eingesetzt, die Ringe für den Ruecksprung der Walze gesetzt und deren Grundeinstellung
* vorgenommen.
* Bei der Enigma um welche es hier geht (Enigma I) gab es zusätzlich ein Steckbrett, welches ebenfalls im Codebuch
* Bei der Enigma um welche es hier geht (Enigma I) gab es zusaetzlich ein Steckbrett, welches ebenfalls im Codebuch
* festgelegt war.
* <p>
* Dieses Codebuch Objekt enthält die Einstellungen eines Tages, welche mittels Getter und Setter
* verarbeitet werden können.
* Dieses Codebuch Objekt enthaelt die Einstellungen eines Tages, welche mittels Getter und Setter
* verarbeitet werden koennen.
* <p>
* Zusätzlich gibt es zu Debug Zwecken eine überschriebene toString Funktion welche das Objekt als String zurück
* Zusaetzlich gibt es zu Debug Zwecken eine ueberschriebene toString Funktion welche das Objekt als String zurueck
* geben kann.
*/
public class Codebuch {
......@@ -44,6 +44,7 @@ public class Codebuch {
* steckverbindung : char[][] : stellt die Steckverbindungen im Steckbrett dar
*/
private char[][] steckverbindung;
//endregion
//region Konstruktor
......@@ -67,16 +68,16 @@ public class Codebuch {
this.steckverbindung[i][1] = 'A';
}
}
//endregion
//region Funktionen & Methoden
/**
* TODO: Dokumentieren
* Holt den Tagesschluessel aus dem Codebuch ab. Ist kein Tag angegeben, wird der aktuelle Tag genutzt.
* Aus dem Tagesschluessel werden die Werte fuer die Walzenlage, Ringstellung und Steckverbindung
* gesetzt.
*
* @param tag : int[] : gibt einen Tag oder mehrere Tage mit
* @param tag : int[] : gibt keinen, einen Tag oder mehrere Tage mit
*/
public void fetchTagesschluessel(int... tag) {
String[] walzenlage, ringstellung, db;
......@@ -89,6 +90,7 @@ public class Codebuch {
this.setTag(Integer.parseInt(db[0]));
// setzen der Walzenlage, Ringstellung, Steckverbindung
walzenlage = db[1].split(",");
for (int i = 0; i < 3; i++) {
this.setWalzenlage(i, Integer.parseInt(walzenlage[i]));
......@@ -100,12 +102,11 @@ public class Codebuch {
}
this.setSteckverbindung(db[3].split(","));
}
/**
* Gibt die aktuelle Instanz des Codebuches als String zurück.
* Hierbei werden der Tag die Walzenlagen, Ring-/Grundstellung sowie die Steckverbindungen zurück gegeben.
* Gibt die aktuelle Instanz des Codebuches als String zurueck.
* Hierbei werden der Tag die Walzenlagen, Ring-/Grundstellung sowie die Steckverbindungen zurueck gegeben.
*
* @return String : String des gesamten Objektes
*/
......@@ -148,6 +149,7 @@ public class Codebuch {
return sb.toString();
}
//endregion
//region Setter
......@@ -156,8 +158,7 @@ public class Codebuch {
*
* @param kabel : String[] : Die Steckverbindungen die gesteckt werden sollen.
* Jeder Eintrag im Array ist ein String mit zwei Zeichen.
* Diese werden in zwei chars zerlegt und anschließend im globalen
* Array gespeichert.
* Diese werden in zwei chars zerlegt und anschließend im globalen Array gespeichert.
*/
private void setSteckverbindung(String[] kabel) {
int counter = 0;
......@@ -184,7 +185,7 @@ public class Codebuch {
* Setzt die Ringstellung dieser Instanz
*
* @param position : int : Auf welche Walze wird der Ring aufgesetzt?
* @param ringstellung : char : An dieser Position soll die nächste Walze weiter gedreht werden.TODO: char || int?
* @param ringstellung : int : An dieser Position soll die nächste Walze weiter gedreht werden.
*/
private void setRingstellung(int position, int ringstellung) {
this.ringstellung[position] = ringstellung;
......@@ -195,12 +196,15 @@ public class Codebuch {
*
* @param tag : int : Tag
*/
void setTag(int tag) { this.tag = tag; }
void setTag(int tag) {
this.tag = tag;
}
//endregion
//region Getter
/**
* Gibt den Tag dieser Instanz zurück
* Gibt den Tag dieser Instanz zurueck
*
* @return int : Tag
*/
......@@ -209,29 +213,28 @@ public class Codebuch {
}
/**
* Gibt die Walzenlage dieser Instanz zurück
* Gibt die Walzenlage dieser Instanz zurueck
*
* @return String[] : Walzenlage
* @return walzenlage : int[] : Walzenlage
*/
public int[] getWalzenlage() {
return walzenlage;
}
/**
* Gibt die Ringstellung dieser Instanz zurück
* Gibt die Ringstellung dieser Instanz zurueck
*
* @return String[] : Ringstellung
* @return ringstellung : int : Ringstellung
*/
public int[] getRingstellung() {
return ringstellung;
}
/**
* Gibt die Steckverbindung dieser Instanz zurück
* Gibt die Steckverbindungen dieser Instanz zurueck
*
* @return String[] : Steckverbindung
* @return steckerverbindung : char[][] : Steckverbindung
*/
// TODO
public char[][] getSteckverbindung() {
return this.steckverbindung;
}
......
......@@ -4,18 +4,22 @@ import java.util.*;
import java.util.Map.Entry;
/**
* Diese Klasse definiert die Zugehörigkeit zwischen den Buchstaben A-Z und dem zugehörigen Morsecode.
* Diese Klasse definiert die Zugehoerigkeit zwischen den Buchstaben A-Z und dem Morsecode.
* Die Funktionen sollen Texte von und zu Morsecode konvertieren.
*/
public class Morsecode {
// Anlegen der codeMap als TreeMap
private TreeMap<String, String> codeMap = new TreeMap<>();
/**
* Im Konstruktor werden alle verfügbaren Buchstaben (A-Z) und deren zugehörigen
* Morsecodes, der codeMap hinzugefügt.
* Anlegen der codeMap als TreeMap
*/
private TreeMap<String, String> codeMap;
/**
* Im Konstruktor werden alle verfuegbaren Buchstaben (A-Z) und deren zugehoerigen
* Morsecodes, der codeMap hinzugefuegt.
*/
public Morsecode() {
codeMap = new TreeMap<>();
this.codeMap.put("A", ".-");
this.codeMap.put("B", "-...");
this.codeMap.put("C", "-.-.");
......@@ -56,60 +60,54 @@ public class Morsecode {
}
/**
* Diese Funktion überprüft ob das übergebene Buchstabe in der codeMap enthalten ist.
* Wenn es enthalten ist, wird der zugehörige Morsecode zurück gegeben, ansonsten null
* Diese Funktion ueberprueft ob der uebergebene Buchstabe in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehoerige Morsecode zurueck gegeben, ansonsten null.
*
* @param buchstabe : char : Zu übersetzender Buchstabe
* @return : String : Das zugehöriger Morsecode aus der codeMap
* @param buchstabe : char : Zu uebersetzender Buchstabe
* @return String : Der zugehoerige Morsecode aus der codeMap
*/
private String getMorsecode(char buchstabe) {
// Testen ob das Char in der codeMap enthalten ist. Wenn ja, raussuchen und zurück geben
return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null);
}
/**
* Der übergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
* übergeben und der zugehörige Morsecode raus gesucht.
* Der uebergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
* uebergeben und der zugehoerige Morsecode raus gesucht.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
* Wenn kein zugehöriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Wenn kein zugehoeriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Enigma nicht vorhanden war.
*
* @param input : String : Zu konventierender Text
* @return String : Die in Morsecode konvertierte Text
* @param input : String : Zu konvertierender Text
* @return String : Der in Morsecode konvertierte Text
*/
public String convertBuchstabeToMorsecode(String input) {
StringBuilder sb = new StringBuilder();
String morsecode;
// Durch alle char im übergebenen String loopen
for(int i = 0; i < input.length(); i++) {
// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
// Durch alle char im uebergebenen String loopen
for (int i = 0; i < input.length(); i++) {
morsecode = this.getMorsecode(input.charAt(i));
if(morsecode != null) {
if (morsecode != null) {
sb.append(morsecode).append(' ');
}
}
// Gibt den konvertierten String zurück
return sb.toString();
}
/**
* Diese Funktion überprüft ob der übergebene Morsecode in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehörige Buchstabe zurück gegeben, ansonsten null
* Diese Funktion ueberprueft ob der uebergebene Morsecode in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehoerige Buchstabe zurueck gegeben, ansonsten null
*
* @param morsecode : String : Der zu übersetzende Morsecode
* @return : String : Das zugehöriger Buchstaben aus der this.codeMap
* @param morsecode : String : Der zu uebersetzende Morsecode
* @return : String : Der zugehoerige Buchstabe aus der codeMap
*/
private String getBuchstabe(String morsecode) {
// Initialisieren des Rückgabe Strings
String result = null;
// Loopt duch die Codemap und erstellt daraus ein Set
for(Entry<String, String> entry : this.codeMap.entrySet()) {
// Wenn Value dem Morsecode entspricht, haben wir unseren Buchstaben gefunden und setzen ihn als Result
if(entry.getValue().equals(morsecode)) {
// Loopt duch die codeMap und erstellt daraus ein Set
for (Entry<String, String> entry : this.codeMap.entrySet()) {
if (entry.getValue().equals(morsecode)) {
result = entry.getKey();
}
}
......@@ -118,14 +116,14 @@ public class Morsecode {
}
/**
* Der übergebene String wird in einen String Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt.
* Anschließend wird der Array durchlaufen und die Elemente an die Funktion getBuchstabe übergeben um den
* zugehörigen Buchstaben zu erhalten.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
* Wenn kein zugehöriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Der uebergebene String wird in ein String Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt.
* Anschließend wird das Array durchlaufen und die Elemente an die Funktion getBuchstabe uebergeben um den
* zugehoerigen Buchstaben zu erhalten.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rueckgabe String zusammengesetzt.
* Wenn kein zugehoeriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Enigma nicht vorhanden war.
*
* @param input : String : Zu konventierender Morsecode
* @param input : String : Zu konvertierender Morsecode
* @return String : Der in Text konvertierte Morsecode
*/
public String convertMorsecodeToBuchstabe(String input) {
......@@ -134,17 +132,14 @@ public class Morsecode {
String[] morsecodes = input.split(" ");
// Durch alle char im übergebenen String loopen
for(String morsecode : morsecodes) {
// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
// Durch alle char im uebergebenen String loopen
for (String morsecode : morsecodes) {
buchstabe = this.getBuchstabe(morsecode);
if(buchstabe != null) {
if (buchstabe != null) {
sb.append(buchstabe);
}
}
// Gibt den konvertierten String zurück
return sb.toString();
}
}
package projekt.enigma.model;
/**
* TODO: Dokumentation aktuallisieren
* Klasse Reflektor
* <br>
* Der Reflektor nimmt einen Buchstaben der Klasse Walze entgegen und und kodiert diesen.
* Der kodierte Buchstabe wird an die Klasse Walze wieder zurückgegeben.
* Der Reflektor nimmt einen Buchstaben der Klasse Walze entgegen und und codiert diesen.
* Der codierte Buchstabe wird an die Klasse Walze wieder zurückgegeben.
* <br>
* Prinzipiell verhält sich die Klasse Reflektor wie die Klasse Walze, außer das sie sich
* nach Betätigung einer Taste nicht dreht (quasi starr montiert ist) und sie gibt keine Signale
* an andere Walzen zum drehen.
* Prinzipiell verhaelt sich die Klasse Reflektor wie die Klasse Walze, außer das sie sich
* nach Betaetigung einer Taste nicht dreht (quasi starr montiert ist) und sie gibt keine Signale
* an andere Walzen zum Drehen.
*/
public class Reflektor {
/**
* Funktion codiere
* <br>
* Durchsucht das konstante Char-Array WALZE_ALPHABET nach der Position eines bestimmten
* Buchstabens und gibt den Character an der entsprechenden Position im konstanten
* Char-Array WALZE_REFLEKTOR zurück.
* Durchsucht den String alphabet nach der Position des mitgegebenen Buchstabens und
* gibt den Character an der entsprechenden Position im String reflektor zurueck.
*
* @return WALZE_REFLEKTOR[iPositionReflektor]: Character: Der kodierte Buchstabe aus dem Reflektor
* @return char : Der codierte Buchstabe aus dem Reflektor
*/
public char codiere(Character buchstabe) {
// alphabet : String mit den Werten des Alphabeths (26 Werte)
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// reflektor : String mit den Werten des Reflektors (26 Werte)
String reflektor = "EJMZALYXVBWFCRQUONTSPIKHGD";
......
package projekt.enigma.model;
/**
* TODO: Dokumentation aktuallisieren
* <p>
* Klasse Walze
* <br>
* Erzeugt ein Objekt des Typs Walze mit den Eigenschaften:
* <br>
* 1. Walzennummer (Die Walze enthält die 26 Buchstaben des Alphabeths und codiert diese.
* 5 verschiedene Walzen stehen zur Auswahl, die jeweils verschieden die Buchstaben des Alphabeths
* paarweise vertauschen)
* 1. Walzennummer (Die Walze enthaelt die 26 Buchstaben des Alphabeths und codiert diese.
* fuenf verschiedene Walzen stehen zur Auswahl, die jeweils verschieden die Buchstaben des Alphabeths
* vertauschen)
* <br>
* 2. Ringstellung (Umspringpunkt der Walze wird festgelegt. Der Umspringpunkt bestimmt
* den Drehzeitpunkt der linken Nachbarwalze)
* den Drehzeitpunkt der linken Nachbarwalze.)
*/
public class Walze {
//region Variablen
/**
* Die Anzahl der getätigten Walzen Drehungen
* Die Anzahl der getaetigten Walzen Drehungen
* TODO: Wieder auf private setzen
*/
public int turns;
/**
* Das String Array aller bekannter aktuellen Walzen
* Das String Array aller bekannter aktueller Walzen
*/
private String[] walzen;
/**
* alphabet : String dass die Buchstaben des Alphabets enthaelt
* alphabet : String : enthaelt die Buchstaben des Alphabets
*/
private String alphabet;
/**
......@@ -35,9 +33,10 @@ public class Walze {
*/
private char ringstellung;
/**
* walzennr : int : Bestimmt, welche Walze genutzt wird
* walzenNr : int : Bestimmt, welche Walze genutzt wird
*/
private int walzenNr;
//endregion
//region Konstruktor
......@@ -48,7 +47,6 @@ public class Walze {
* @param ringstellung : int : Einstellung des Umsprungpunktes
*/
public Walze(int walzenNr, int ringstellung) {
this.walzen = new String[5];
this.walzen[0] = "EKMFLGDQVZNTOWYHXUSPAIBRCJ";
this.walzen[1] = "AJDKSIRUXBLHWTMCQGZNPYFVOE";
......@@ -61,33 +59,34 @@ public class Walze {
this.setWalzenNr(walzenNr);
this.setRingstellung(ringstellung);
}
//endregion
//region Funktionen & Methoden
/**
* Dreht die Walze: Zählt die Umdrehungen (Turns) um eines hoch oder runter, je nach Drehrichtung.
* Dreht die Walze: Zaehlt die Umdrehungen (turns) um eins hoch oder runter, je nach Drehrichtung.
* <p>
* Ueberprueft, ob der Umspringpunkt der Walze nach der Drehung erreicht wurde.
*
* @param richtung : int : 1 dreht die Walze weiter und -1 dreht sie einen Schritt zurück
* @param richtung : int : 1 dreht die Walze weiter und -1 dreht sie einen Schritt zurueck
* @return checkRing : boolean : gibt true zurueck wenn der Umspringpunkt erreicht wurde
* TODO: Doku
*/
public boolean dreheWalze(int richtung) {
boolean checkRing = false;
int korrektorFaktor = 0;
int korrekturFaktor = 0;
if (richtung == -1 || richtung == 1) {
if ((richtung == -1) || (richtung == 1)) {
if (richtung == 1) {
this.turns++;
} else if (richtung == -1) {
korrektorFaktor = 1;
korrekturFaktor = 1;
this.turns--;
}
// gleicht die Ringstellung mit der aktuellen Position ab
if ((this.alphabet.indexOf(this.getPosition()) + korrektorFaktor) % 26 == this.alphabet.indexOf(this.ringstellung)) {
if ((this.alphabet.indexOf(this.getPosition()) + korrekturFaktor) % 26
== this.alphabet.indexOf(this.ringstellung)) {
checkRing = true;
}
}
......@@ -96,34 +95,32 @@ public class Walze {
}
/**
* Codiert den mitgegebenen Buchstaben anhand der gewaehlten Walze.
* Codiert den mitgegebenen Buchstaben anhand er gewaehlten Walze.
*
* @param buchstabe : char : Buchstabe, der verschluesselt werden soll
* @return buchstabe : char : verschluesselter Buchstabe
* @return char : verschluesselter Buchstabe
*/
public char codiere(char buchstabe) {
return this.fetchWalze().charAt((this.alphabet.indexOf(buchstabe) + this.turns) % 26);
}
/**
* Decodiert den mitgegebenen Buchstaben mit Hilfe der (verschobenen) Walze
* Decodiert den mitgegebenen Buchstaben anhand des Alphabets.
*
* @param buchstabe : char : Buchstabe, der decodiert werden soll
* @return buchstabe : char : decodierter Buchstabe
* @return char : decodierter Buchstabe
*/
public char codiere2(char buchstabe) {
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 260) % 26);
}
/**
* Holt den korrekten String zu der Walze
*
* @return walze : Character[] : gibt die gewaehlte Walze zurueck
* @return String : Gibt den Verschluesselunngsstring der ausgewaehlten Walze zurueck.
*/
private String fetchWalze() {
return walzen[walzenNr];
}
//endregion
//region Setter
......@@ -143,11 +140,11 @@ public class Walze {
/**
* Setzt die Initiale Ringstellung der Walze.
* Es sind nur Zahlen von 1 - 26 zugelassen.
* <p>
* <br>
* Die Ringstellung wird zum char umgewandelt.
* Im Fehlerfall wird die Ringstellung standardmaessig auf 'Z' gesetzt.
*
* @param ringstellung : int : Punkt an dem die Walze umspringt
* @param ringstellung : int : Punkt an dem die Nachbarwalze umspringt
*/
public void setRingstellung(int ringstellung) {
if ((ringstellung > 0) && (ringstellung <= 26)) {
......@@ -159,9 +156,8 @@ public class Walze {
/**
* * TODO: Funktionsname hat sich geändert
* Gibt die Grundeinstellung der Walze ein. Nur Buchstaben von A - Z sind zugelassen.
* Buchstaben werden automatisch in Grossbuchstaben umgewandelt.
* Ist die Grundeinstellung nicht 'A', wird die Methode dreheWalze() aufgerufen.
* Stellt die Grundeinstellung der Walze ein.
* Ermittelt, wie oft die Walze gedreht werden muss, bis die Grundeinstellung erreicht ist.
*
* @param buchstabe : Character : Einstellung der Walze
*/
......@@ -172,9 +168,9 @@ public class Walze {
//region Getter
/**
* Gibt den Character zurueck, der aktuell in der Walze eingestellt ist
* Gibt den Buchstabe zurueck, der aktuell in der Walze eingestellt ist.
*
* @return Character am Index 0 des (verschobenen) Alphabets zurueck
* @return char : Ermittelte stelle im Alphabet, anhand der aktuellen Anzahl der Drehungen
*/
public Character getPosition() {
return this.alphabet.charAt(turns % 26);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment