From a2f47e57b0777ba16e8f97bab3dd838253290acd Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Wed, 27 Nov 2019 23:55:16 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Erster=20Step=20der=20Codierung,=20=20umwan?= =?UTF-8?q?dlung=20in=20Morsecode=20und=20=C3=9Cbergabe=20an=20den=20Funkr?= =?UTF-8?q?aum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Enigma/App.java | 146 +++++++++++------- src/main/java/Enigma/model/Codebuch.java | 118 +++++++++----- .../java/Enigma/model/DatenbankSqlite.java | 15 +- src/main/java/Enigma/model/Hardware.java | 118 +++++++++++--- src/main/java/Enigma/model/Reflektor.java | 4 +- src/main/java/Enigma/model/Walze.java | 17 +- src/test/java/Enigma/model/CodebuchTest.java | 4 +- src/test/java/Enigma/model/HardwareTest.java | 22 +-- 8 files changed, 307 insertions(+), 137 deletions(-) diff --git a/src/main/java/Enigma/App.java b/src/main/java/Enigma/App.java index 397e3da..d166be1 100644 --- a/src/main/java/Enigma/App.java +++ b/src/main/java/Enigma/App.java @@ -1,74 +1,112 @@ package Enigma; -import Enigma.model.Codebuch; -import Enigma.model.DatenbankSqlite; -import Enigma.model.Hardware; +import Enigma.model.*; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; +import org.apache.http.HttpException; import java.io.IOException; import java.sql.SQLException; -import java.util.Calendar; -import java.util.TimeZone; +import java.time.LocalDate; +import java.time.ZoneId; /** * JavaFX App */ public class App extends Application { - private static Scene scene; - private Codebuch cb; - private Hardware h; - - @Override - public void start(Stage stage) throws IOException { - scene = new Scene(loadFXML("gui")); - stage.setScene(scene); - stage.show(); - holeCodebuch(); - } - - static void setRoot(String fxml) throws IOException { - scene.setRoot(loadFXML(fxml)); - } - - private static Parent loadFXML(String fxml) throws IOException { - FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml")); - return fxmlLoader.load(); - } - - public static void main(String[] args) { - Application.launch(); - } - - public void holeCodebuch() { - Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); - - try { - this.cb = new DatenbankSqlite().getCodebuch(Calendar.DATE); - } catch (SQLException ignored) { } - - for(int i = 0; i < 3; i++) { - h.setWalzen(i + 1, Integer.parseInt(cb.getWalzenlage()[i]), cb.getRingstellung()[i].charAt(0)); - } - - /*Walze w1 = new Walze(3); - w1.setzeNotch(13); - Walze w2 = new Walze(5); - w2.setzeNotch(1); - Walze w3 = new Walze(1); - w3.setzeNotch(20); - Reflektor r = new Reflektor(); + private static Scene scene; + private Codebuch cb; + private Hardware h; + + static void setRoot(String fxml) throws IOException { + scene.setRoot(loadFXML(fxml)); + } + + private static Parent loadFXML(String fxml) throws IOException { + FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml")); + return fxmlLoader.load(); + } + + public static void main(String[] args) { + Application.launch(); + } + + @Override + public void start(Stage stage) throws IOException { + scene = new Scene(loadFXML("gui")); + stage.setScene(scene); + stage.show(); + + initialisiereHardware(); + + /** + * TODO: Nur zum Testen muss später wieder gelöscht werden. + */ + //region Test + h.setKenngruppe("deisold"); + String nachricht = "Hello world."; + + for (char buchstabe : nachricht.toCharArray()) { + System.out.print(buchstabe + ":"); + System.out.print(h.codiere(buchstabe)); + System.out.println(" W1:" + h.getWalzen()[0].getBuchstabe() + " W2:" + h.getWalzen()[1].getBuchstabe() + " W3:" + h.getWalzen()[2].getBuchstabe()); + } + try { + System.out.println(h.getNachricht()); + h.sendeNachricht(); + } catch (HttpException e) { + e.printStackTrace(); + } + //endregion + } + + /** + * Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch Objekt + * Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend + * in die Hardware gebaut. + * <p> + * Ein Reflektor wird definiert, jedoch keine Werte zugewisen, da wir nur einen besitzen und + * deshalb alle Einstellungen hierfür Statisch im Reflektor definiert haben. + * <p> + * Das Steck wird ebenfalls definiert und die notwendigen Kabel eingesteckt laut dem heutigen + * Codebuch Eintrag. + */ + private void initialisiereHardware() { + + // Hole den heutigen Eintrag aus der SQLite Datenbank und erstelle daraus ein Codebuch Objekt + try { + this.cb = new DatenbankSqlite().getCodebuch(LocalDate.now(ZoneId.of("Europe/Berlin")).getDayOfMonth()); + } catch (SQLException ignored) { + } + + // TODO: Was zum Henker macht der hier????!? + System.out.println(this.cb.toString()); + + // Das Steckbrett initialisieren Steckbrett sb = new Steckbrett(); + char[][] verbinder = cb.getSteckverbindung(); + // Für jedes Kabel eine Verbindung auf dem Steckbrett setzen + for (char[] kabel : verbinder) { + sb.setzeVertauschung(kabel[0], kabel[1]); + } + + // Die Hardware aus dem Koffer holen (initialisieren) + this.h = new Hardware(); + + // Den Ring an der Walze anbringen und die Walze dann in die Hardware einsetzen + h.setWalzen(0, cb.getWalzenlage()[0], cb.getRingstellung()[0]); + h.setWalzen(1, cb.getWalzenlage()[1], cb.getRingstellung()[1]); + h.setWalzen(2, cb.getWalzenlage()[2], cb.getRingstellung()[2]); + + // Der Hardware das gesetzte Steckbrett zuweisen + h.setSteckbrett(sb); - if(w1.dreheWalze()) { - if(w2.dreheWalze()) { - w3.dreheWalze(); - } - }*/ - } + // Ein Reflektor Objekt erstellen und der Hardware bekannt geben + h.setReflektor(new Reflektor()); + } } \ No newline at end of file diff --git a/src/main/java/Enigma/model/Codebuch.java b/src/main/java/Enigma/model/Codebuch.java index 0c6d01d..60f699e 100644 --- a/src/main/java/Enigma/model/Codebuch.java +++ b/src/main/java/Enigma/model/Codebuch.java @@ -9,23 +9,38 @@ package Enigma.model; * vorgenommen. * Bei der Enigma um welche es hier geht (Enigma I) gab es zusätzlich 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. - * + * <p> * Zusätzlich gibt es zu Debug Zwecken eine überschriebene toString Funktion welche das Objekt als String zurück * geben kann. */ public class Codebuch { private int tag; - private String[] Walzenlage; - private String[] Ringstellung; - private String[] Steckverbindung; - - Codebuch() { - this.Walzenlage = new String[3]; - this.Ringstellung = new String[3]; - this.Steckverbindung = new String[10]; + private int[] walzenlage; + private char[] ringstellung; + private char[][] steckverbindung; + + /** + * Im Konstruktor werden die Standart Werte gesetzt + * <p> + * walzenlage : int[3] : Hier wird die Position der drei Walzen festgelegt. + * ringstellung : char[3] : Jede Walze hat einen Ring. Der Index steht für die Walze und der Value für + * die Position des Ringes. + * steckverbindung : char[10][] : Zehn Kabel können in das Steckbrett gesteckt werden. In diesem Array werden + * die Kabel mit ihren jeweiligen Buchsen hinterlegt. + */ + public Codebuch() { + this.walzenlage = new int[3]; + this.ringstellung = new char[3]; + this.steckverbindung = new char[10][]; + + for(int i = 0; i < 10; i++) { + this.steckverbindung[i] = new char[2]; + this.steckverbindung[i][0] = 'A'; + this.steckverbindung[i][1] = 'A'; + } } /** @@ -44,33 +59,33 @@ public class Codebuch { sb.append("Tag: ").append(this.getTag()).append("\n"); sb.append("Walzenlage: "); - for(String wl : this.getWalzenlage()) { + for (int wl : this.getWalzenlage()) { sb.append(wl).append(","); wlLoop = true; } - if(wlLoop) { + if (wlLoop) { sb.setLength(sb.length() - 1); } sb.append("\n"); sb.append("Ringstellung: "); - for(String rs : this.getRingstellung()) { + for (char rs : this.getRingstellung()) { sb.append(rs).append(","); rsLoop = true; } - if(rsLoop) { + if (rsLoop) { sb.setLength(sb.length() - 1); } sb.append("\n"); sb.append("Steckverbindung: "); - for (String s : this.getSteckverbindung()) { - if (!s.isEmpty()) { - sb.append(s).append(","); + for (char[] s : this.getSteckverbindung()) { + if (Character.isLetter(s[0])) { + sb.append(s[0]).append(":").append(s[1]).append(","); svLoop = true; } } - if(svLoop) { + if (svLoop) { sb.setLength(sb.length() - 1); } sb.append("\n"); @@ -80,65 +95,84 @@ public class Codebuch { /** * Gibt den Tag dieser Instanz zurück + * * @return int : Tag */ public int getTag() { return tag; } + /** + * Setzt den Tag dieser Instanz + * + * @param tag : int + */ + public void setTag(int tag) { + this.tag = tag; + } + /** * Gibt die Walzenlage dieser Instanz zurück + * * @return String[] : Walzenlage */ - public String[] getWalzenlage() { - return Walzenlage; + public int[] getWalzenlage() { + return walzenlage; } /** * Gibt die Ringstellung dieser Instanz zurück + * * @return String[] : Ringstellung */ - public String[] getRingstellung() { - return Ringstellung; + public char[] getRingstellung() { + return ringstellung; } /** * Gibt die Steckverbindung dieser Instanz zurück + * * @return String[] : Steckverbindung */ - public String[] getSteckverbindung() { - return Steckverbindung; + public char[][] getSteckverbindung() { + return this.steckverbindung; } /** - * Setzt den Tag dieser Instanz - * @param tag : int + * Setzt die Steckverbindung dieser Instanz + * + * @param steckverbindung : String[] : Die Steckverbindungen die gesteckt werden sollen. + * Jeder Eintrag im Array ist ein String mit zwei Zeichen. + * Diese werden in zwei char zerlegt und anschließend im globalen + * Array gespeichert. */ - public void setTag(int tag) { - this.tag = tag; + public void setSteckverbindung(String[] steckverbindung) { + int counter = 0; + char[] verbindung = new char[2]; + for (String stecker : steckverbindung) { + verbindung[0] = stecker.charAt(0); + verbindung[1] = stecker.charAt(1); + this.steckverbindung[counter++] = verbindung; + } } /** * Setzt die Walzenlage dieser Instanz - * @param walzenlage : String[] + * + * @param position : int : Position der Walze + * @param walzenlage : int : Welche Walze wurde eingesetzt */ - public void setWalzenlage(String[] walzenlage) { - Walzenlage = walzenlage; + public void setWalzenlage(int position, int walzenlage) { + this.walzenlage[position] = walzenlage; } /** * Setzt die Ringstellung dieser Instanz - * @param ringstellung : String[] - */ - public void setRingstellung(String[] ringstellung) { - Ringstellung = ringstellung; - } - - /** - * Setzt die Steckverbindung dieser Instanz - * @param steckverbindung : String[] + * + * @param position : int : Auf welche Walze wird der Ring aufgesetzt? + * @param ringstellung : char : An dieser Position soll die nächste Walze weiter gedreht werden. */ - public void setSteckverbindung(String[] steckverbindung) { - Steckverbindung = steckverbindung; + public void setRingstellung(int position, char ringstellung) { + this.ringstellung[position] = ringstellung; } } diff --git a/src/main/java/Enigma/model/DatenbankSqlite.java b/src/main/java/Enigma/model/DatenbankSqlite.java index f9e0a9b..51f34c1 100644 --- a/src/main/java/Enigma/model/DatenbankSqlite.java +++ b/src/main/java/Enigma/model/DatenbankSqlite.java @@ -51,10 +51,21 @@ public class DatenbankSqlite { pstm.setInt(1, tag); ResultSet rs = pstm.executeQuery(); + String[] walzenlage, ringstellung, steckverbindung; + while (rs.next()) { cb.setTag(rs.getInt("Tag")); - cb.setWalzenlage(rs.getString("Walzenlage").split(",")); - cb.setRingstellung(rs.getString("Ringstellung").split(",")); + + walzenlage = rs.getString("Walzenlage").split(","); + for(int i = 0; i < 3; i++) { + cb.setWalzenlage(i, Integer.parseInt(walzenlage[i])); + } + + ringstellung = rs.getString("Ringstellung").split(","); + for(int i = 0; i < 3; i++) { + cb.setRingstellung(i, ringstellung[i].charAt(0)); + } + cb.setSteckverbindung(rs.getString("Steckverbindung").split(",")); } diff --git a/src/main/java/Enigma/model/Hardware.java b/src/main/java/Enigma/model/Hardware.java index 694912c..efb0517 100644 --- a/src/main/java/Enigma/model/Hardware.java +++ b/src/main/java/Enigma/model/Hardware.java @@ -4,6 +4,19 @@ import org.apache.http.HttpException; import java.io.IOException; +/** + * In dieser Klasse wird die Hardware zusammen gefasst. + * Alle Komponenter der Enigma laufen hier zusammen. + * + * <p> + * walzen : Walze[] : Ist ein Array der drei eingebauten Walzen Objekte + * steckbrett : Steckbrett : Das Steckbrett mit den Verbindungen aus dem Codebuch + * reflektor : Reflektor : Dies ist das Objekt der Reflektors + * nachricht : String : Die verschlüsselte Nachricht wird in diesem String zusammen gesetzt und gespeichert + * kenngruppe : String : Früher definierte die Kennzeichnung die Einheit welche diese Enigma benutzte. + * Wir missbrauchen die Kenngruppe für einen Benutzernamen + * </p> + */ public class Hardware { private Walze[] walzen; @@ -12,8 +25,12 @@ public class Hardware { private String nachricht; private String kenngruppe; - Hardware() { - this.walzen = new Walze[4]; + /** + * Im Konstruktor legen wir die Anzahl der Walzen fest welche die Hardware aufnehmen kann. + * Die Enigma I welche hier nachgebildet werden soll, konnte drei Walzen aufnehmen. + */ + public Hardware() { + this.walzen = new Walze[3]; } /** @@ -37,13 +54,18 @@ public class Hardware { /** * Setzt den Startwert (position) der Walze (walze) * - * @param walze : int : Nummer der Walze + * @param walze : int : Nummer der Walze * @param buchstabe : char : Buchstabe der zugewiesen soll */ public void setzePosition(int walze, char buchstabe) { } - // Befehl die Nachricht an den Funker zu übergeben + /** + * Befehl die Nachricht an den Funker zu übergeben + * + * @throws IOException : Die Antwort konnte nicht gelesen werden + * @throws HttpException : Die Nachricht konnte nicht abgesendet werden + */ public void sendeNachricht() throws IOException, HttpException { new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(this.nachricht), this.kenngruppe); } @@ -60,67 +82,125 @@ public class Hardware { } /** - * Fügt die gedrückte Taste der Nachricht hinzu + * Verschlüsselt den übergebenen Buchstaben und fügt ihn der Nachricht hinzu * - * @param buchstabe char : Der zu verschlüsselnde Buchstabe - * @return char : Der verschlüsselte Buchstabe + * @param buchstabe char : Der zu ver/entschlüsselnde Buchstabe + * @return char : Der ver/entschlüsselte Buchstabe */ - public char tippeBuchstabe(char buchstabe) { - buchstabe = this.steckbrett.codiere(buchstabe); + public char codiere(char buchstabe) { + buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe)); + buchstabe = this.walzen[0].codiere(buchstabe); buchstabe = this.walzen[1].codiere(buchstabe); buchstabe = this.walzen[2].codiere(buchstabe); - buchstabe = this.walzen[3].codiere(buchstabe); buchstabe = this.reflektor.codiere(buchstabe); - buchstabe = this.walzen[3].codiere2(buchstabe); buchstabe = this.walzen[2].codiere2(buchstabe); buchstabe = this.walzen[1].codiere2(buchstabe); + buchstabe = this.walzen[0].codiere2(buchstabe); buchstabe = this.steckbrett.codiere(buchstabe); + this.dreheWalzen(); + this.nachricht += buchstabe; return buchstabe; } /** - * Nachricht entschlüsseln - * - * @param nachricht : String : Verschlüsselte Nachricht - * @return String : Die Klartext Nachricht + * Nach jeder codierung eines Buchstabens müssen die Walzen gedreht werden. + * Hier überprüfen wir welche der Walzen gedreht werden müssen und stoßen die Vorgang an. */ - private String decodiereNachricht(String nachricht) { - - return ""; + private void dreheWalzen() { + if (this.walzen[0].dreheWalze()) { + if (this.walzen[1].dreheWalze()) { + this.walzen[2].dreheWalze(); + } + } } + /** + * Gibt die verbauten Walzen Objekte zurück + * + * @return Walze[] : Array mit den Walzen Objekten + */ public Walze[] getWalzen() { return this.walzen; } - public void setWalzen(int walze, int position, int ringstellung) { + /** + * Setzt eine Walze ein und speichert das Objekt im Walzen Array + * + * @param position : int : Position der Walze + * @param walze : int : Die Nummer der Walze + * @param ringstellung : int : Umsprung Punkt der Walze + */ + public void setWalzen(int position, int walze, int ringstellung) { this.walzen[position] = new Walze(walze, ringstellung); } + /** + * Gibt das Objekt des Steckbretts zurück + * + * @return Steckbrett : Das eingesetzte Steckbrett mit seinen Kabeln wenn eingesteckt + */ public Steckbrett getSteckbrett() { return steckbrett; } + /** + * Setzt das übergebene Steckbrett Objekt in die Hardware ein + * + * @param steckbrett : Steckbrett : Objekt des Steckbretts mit allen verbundenen Kabeln + */ public void setSteckbrett(Steckbrett steckbrett) { this.steckbrett = steckbrett; } + /** + * Liest den Reflektor aus und gibt ihn zurück + * + * @return Reflektor : Objekt des Reflektors + */ public Reflektor getReflektor() { return reflektor; } + /** + * Setzt den Reflektor ein. + * In der Enigma I welche hier nachgebaut wird, gab es nur einen Reflektor. + * Spätere Versionen haten zwei oder mehr, deshalb haben wir hier auch schon ein Objekt dafür erstellt, + * welches ausgetauscht werden kann. + * + * @param reflektor : Reflektor : Das Obejtk des Reflektors + */ public void setReflektor(Reflektor reflektor) { this.reflektor = reflektor; } + /** + * Liest die Kenngruppe aus welche die Maschine gerade besitzt. Früher war dies eine eindeutige Nummer + * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen. + * + * @return String : Kenngruppe + */ public String getKenngruppe() { return kenngruppe; } + /** + * Setzt die Kenngruppe welche die Enigma gerade benutzt. + * + * @param kenngruppe : String : Kenngruppe welche die Enigma gerade benutzt + */ public void setKenngruppe(String kenngruppe) { this.kenngruppe = kenngruppe; } + + /** + * Gibt die bisher erstellte Nachricht zurück + * + * @return String : Erstellte Nachricht + */ + public String getNachricht() { + return nachricht; + } } diff --git a/src/main/java/Enigma/model/Reflektor.java b/src/main/java/Enigma/model/Reflektor.java index 1457cf3..a3069b8 100644 --- a/src/main/java/Enigma/model/Reflektor.java +++ b/src/main/java/Enigma/model/Reflektor.java @@ -10,7 +10,7 @@ package Enigma.model; * nach Betätigung einer Taste nicht dreht (starr montiert) und sie gibt keine Signale * an andere Walzen zum drehen. */ -class Reflektor { +public class Reflektor { /** * Konstanten und Variablen der Klasse Reflektor @@ -34,7 +34,7 @@ class Reflektor { * * @return reflektorBuchstabeRaus: Character: Der kodierte Buchstabe aus dem Reflektor */ - char codiere(Character buchstabe) { + public char codiere(Character buchstabe) { int iPositionReflektor = 0; /*Ermittelt die Position des Buchstaben buchstabe auf der Alphabetswalze*/ diff --git a/src/main/java/Enigma/model/Walze.java b/src/main/java/Enigma/model/Walze.java index 4f7317f..376934b 100644 --- a/src/main/java/Enigma/model/Walze.java +++ b/src/main/java/Enigma/model/Walze.java @@ -125,13 +125,13 @@ public class Walze { boolean checkRing; - if (iPositionBuchstabe == 25) { - iPositionBuchstabe = 0; + if (this.iPositionBuchstabe == 25) { + this.iPositionBuchstabe = 0; } else { - iPositionBuchstabe += 1; + this.iPositionBuchstabe += 1; } - checkRing = iPositionBuchstabe == getRingstellung(); + checkRing = this.iPositionBuchstabe == getRingstellung(); return checkRing; } @@ -147,12 +147,21 @@ public class Walze { * @return chiffrierterBuchstabe : Character : chiffrierter Buchstabe */ public char codiere(char buchstabe) { + /** + * TODO: contains fragt ab ob der char im Alphabet enthalten ist. Das sollten wir vielleicht noch in eine + * Hilfsfunktion packen. Vielleicht sogar in der Hardware Klasse. + */ + boolean contains = false; for (int i = 0; i < walzeAlpha.length; i++) { if (walzeAlpha[i].equals(buchstabe)) { buchstabe = walzenNummer()[i]; + contains = true; break; } } + if(!contains) { + buchstabe = 'X'; + } return buchstabe; } diff --git a/src/test/java/Enigma/model/CodebuchTest.java b/src/test/java/Enigma/model/CodebuchTest.java index 91e2653..aa64dea 100644 --- a/src/test/java/Enigma/model/CodebuchTest.java +++ b/src/test/java/Enigma/model/CodebuchTest.java @@ -14,11 +14,9 @@ public class CodebuchTest { "Steckverbindung: CO,DI,FR,HU,JW,LS,TX\n"; try { - // Codebuch abrufen - Codebuch cb = new DatenbankSqlite().getCodebuch(1); // Ausgabe auf der Konsole String result = new DatenbankSqlite().getCodebuch(1).toString(); - Assert.assertEquals(expected, result); + Assert.assertEquals(result, expected, result); } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/test/java/Enigma/model/HardwareTest.java b/src/test/java/Enigma/model/HardwareTest.java index 1d7196f..78bd241 100644 --- a/src/test/java/Enigma/model/HardwareTest.java +++ b/src/test/java/Enigma/model/HardwareTest.java @@ -10,9 +10,9 @@ public class HardwareTest { Hardware h = new Hardware(); h.setReflektor(new Reflektor()); h.setSteckbrett(new Steckbrett()); - h.setWalzen(1, 1, 1); - h.setWalzen(2, 2, 1); - h.setWalzen(3, 3, 1); + h.setWalzen(0, 1, 1); + h.setWalzen(1, 2, 1); + h.setWalzen(2, 3, 1); /* A = E = S = G = Y = O = Y = O @@ -33,18 +33,18 @@ public class HardwareTest { Reflektor {'E', 'J', 'M', 'Z', 'A', 'L', 'Y', 'X', 'V', 'B', 'W', 'F', 'C', 'R', 'Q', 'U', 'O', 'N', 'T', 'S', 'P', 'I', 'K', 'H', 'G', 'D'}; */ - char result = h.tippeBuchstabe('A'); + char result = h.codiere('A'); Assert.assertEquals("Codiere: Erwartet O, erhalten "+ result, 'O', result); - result = h.tippeBuchstabe('I'); + result = h.codiere('I'); Assert.assertEquals("Codiere: Erwartet S, erhalten "+ result, 'S', result); - result = h.tippeBuchstabe('F'); + result = h.codiere('F'); Assert.assertEquals("Codiere: Erwartet P, erhalten "+ result, 'P', result); - result = h.tippeBuchstabe('O'); + result = h.codiere('O'); Assert.assertEquals("Decodiere: Erwartet A, erhalten "+ result, 'A', result); - result = h.tippeBuchstabe('S'); + result = h.codiere('S'); Assert.assertEquals("Decodiere: Erwartet I, erhalten "+ result, 'I', result); - result = h.tippeBuchstabe('P'); + result = h.codiere('P'); Assert.assertEquals("Decodiere: Erwartet F, erhalten "+ result, 'F', result); h.getSteckbrett().setzeVertauschung('B', 'G'); @@ -53,10 +53,10 @@ public class HardwareTest { h.getSteckbrett().setzeVertauschung('M', 'Q'); h.getSteckbrett().setzeVertauschung('T', 'X'); - result = h.tippeBuchstabe('I'); + result = h.codiere('I'); Assert.assertEquals("Codiere: Erwartet F, erhalten "+ result, 'F', result); - result = h.tippeBuchstabe('F'); + result = h.codiere('F'); Assert.assertEquals("Codiere: Erwartet I, erhalten "+ result, 'I', result); } } \ No newline at end of file -- GitLab From 3dd63db1bf112a6b9551a88dfd45ed6bc7e81e4c Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Thu, 28 Nov 2019 10:17:19 +0100 Subject: [PATCH 2/2] Fehlerbehebungen und Fehlende Funktionen - Ringstellungen und Steckverbindungen werden jetzt richtig gesetzt. - Fehlende Funktionen ausgeschrieben. - Nachrichten empfangen und decodieren. --- src/main/java/Enigma/model/Codebuch.java | 29 ++++++++-------- .../java/Enigma/model/DatenbankSqlite.java | 8 ++--- src/main/java/Enigma/model/Hardware.java | 33 +++++++++++++++---- 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/main/java/Enigma/model/Codebuch.java b/src/main/java/Enigma/model/Codebuch.java index 60f699e..ee7b96e 100644 --- a/src/main/java/Enigma/model/Codebuch.java +++ b/src/main/java/Enigma/model/Codebuch.java @@ -19,7 +19,7 @@ package Enigma.model; public class Codebuch { private int tag; private int[] walzenlage; - private char[] ringstellung; + private int[] ringstellung; private char[][] steckverbindung; /** @@ -33,10 +33,10 @@ public class Codebuch { */ public Codebuch() { this.walzenlage = new int[3]; - this.ringstellung = new char[3]; + this.ringstellung = new int[3]; this.steckverbindung = new char[10][]; - for(int i = 0; i < 10; i++) { + for (int i = 0; i < 10; i++) { this.steckverbindung[i] = new char[2]; this.steckverbindung[i][0] = 'A'; this.steckverbindung[i][1] = 'A'; @@ -69,7 +69,7 @@ public class Codebuch { sb.append("\n"); sb.append("Ringstellung: "); - for (char rs : this.getRingstellung()) { + for (int rs : this.getRingstellung()) { sb.append(rs).append(","); rsLoop = true; } @@ -79,11 +79,9 @@ public class Codebuch { sb.append("\n"); sb.append("Steckverbindung: "); - for (char[] s : this.getSteckverbindung()) { - if (Character.isLetter(s[0])) { - sb.append(s[0]).append(":").append(s[1]).append(","); - svLoop = true; - } + for (char[] verbindung : this.getSteckverbindung()) { + sb.append(verbindung[0]).append(":").append(verbindung[1]).append(","); + svLoop = true; } if (svLoop) { sb.setLength(sb.length() - 1); @@ -125,7 +123,7 @@ public class Codebuch { * * @return String[] : Ringstellung */ - public char[] getRingstellung() { + public int[] getRingstellung() { return ringstellung; } @@ -141,15 +139,16 @@ public class Codebuch { /** * Setzt die Steckverbindung dieser Instanz * - * @param steckverbindung : String[] : Die Steckverbindungen die gesteckt werden sollen. + * @param kabel : String[] : Die Steckverbindungen die gesteckt werden sollen. * Jeder Eintrag im Array ist ein String mit zwei Zeichen. * Diese werden in zwei char zerlegt und anschließend im globalen * Array gespeichert. */ - public void setSteckverbindung(String[] steckverbindung) { + public void setSteckverbindung(String[] kabel) { int counter = 0; - char[] verbindung = new char[2]; - for (String stecker : steckverbindung) { + + for (String stecker : kabel) { + char[] verbindung = new char[2]; verbindung[0] = stecker.charAt(0); verbindung[1] = stecker.charAt(1); this.steckverbindung[counter++] = verbindung; @@ -172,7 +171,7 @@ public class Codebuch { * @param position : int : Auf welche Walze wird der Ring aufgesetzt? * @param ringstellung : char : An dieser Position soll die nächste Walze weiter gedreht werden. */ - public void setRingstellung(int position, char ringstellung) { + public void setRingstellung(int position, int ringstellung) { this.ringstellung[position] = ringstellung; } } diff --git a/src/main/java/Enigma/model/DatenbankSqlite.java b/src/main/java/Enigma/model/DatenbankSqlite.java index 51f34c1..fd7270d 100644 --- a/src/main/java/Enigma/model/DatenbankSqlite.java +++ b/src/main/java/Enigma/model/DatenbankSqlite.java @@ -57,13 +57,13 @@ public class DatenbankSqlite { cb.setTag(rs.getInt("Tag")); walzenlage = rs.getString("Walzenlage").split(","); - for(int i = 0; i < 3; i++) { + for (int i = 0; i < 3; i++) { cb.setWalzenlage(i, Integer.parseInt(walzenlage[i])); } ringstellung = rs.getString("Ringstellung").split(","); - for(int i = 0; i < 3; i++) { - cb.setRingstellung(i, ringstellung[i].charAt(0)); + for (int i = 0; i < 3; i++) { + cb.setRingstellung(i, Integer.parseInt(ringstellung[i])); } cb.setSteckverbindung(rs.getString("Steckverbindung").split(",")); @@ -136,7 +136,7 @@ public class DatenbankSqlite { /** * Generiert einen String aus 10 * 2 unterschiedlichen Großbuchstaben - * @return String => 10 Buchstabenkombinationen mit Komma getrennt + * @return String => 10 Buchstabenkombinationen mit Komma getrennt */ /* private static String steckverbindung(){ diff --git a/src/main/java/Enigma/model/Hardware.java b/src/main/java/Enigma/model/Hardware.java index efb0517..e9eebc5 100644 --- a/src/main/java/Enigma/model/Hardware.java +++ b/src/main/java/Enigma/model/Hardware.java @@ -31,6 +31,7 @@ public class Hardware { */ public Hardware() { this.walzen = new Walze[3]; + this.nachricht = ""; } /** @@ -39,7 +40,8 @@ public class Hardware { * @param walze : int : Setzt die Walze mit der angegebenen Nummer ein * @param walzenNr : int : Die Nummer der einzusetzenden Walze */ - public void setzeWalzenNr(int walze, int walzenNr) { + public void setzeWalzenNr(int walze, int walzenNr, int ringstellung) { + this.walzen[walze] = new Walze(walzenNr, ringstellung); } /** @@ -49,6 +51,7 @@ public class Hardware { * @param position : int : Umspringpunkt auf der Walze */ public void setzeRing(int walze, int position) { + this.walzen[walze].setRingstellung(position); } /** @@ -58,6 +61,7 @@ public class Hardware { * @param buchstabe : char : Buchstabe der zugewiesen soll */ public void setzePosition(int walze, char buchstabe) { + this.walzen[walze].setBuchstabe(buchstabe); } /** @@ -73,12 +77,29 @@ public class Hardware { /** * Gibt die letzte empfangene Nachricht zurück * <p> - * String[0] = Die verschlüsselte Nachricht - * String[1] = Nachricht im Klartext + * String[0} Tag wann die Nachricht gesendet wurde + * String[1] = Die verschlüsselte Nachricht + * String[2] = Nachricht im Klartext */ public String[] empfangeNachricht() { + String[] codierteNachricht = new String[3]; + Morsecode mc = new Morsecode(); - return new String[2]; + try { + codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe); + String morsecode = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]); + String decodiert = ""; + + for (char buchstabe : morsecode.toCharArray()) { + decodiert += this.codiere(buchstabe); + } + + codierteNachricht[2] = decodiert; + + } catch (IOException e) { + e.printStackTrace(); + } + return codierteNachricht; } /** @@ -88,6 +109,8 @@ public class Hardware { * @return char : Der ver/entschlüsselte Buchstabe */ public char codiere(char buchstabe) { + this.dreheWalzen(); + buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe)); buchstabe = this.walzen[0].codiere(buchstabe); buchstabe = this.walzen[1].codiere(buchstabe); @@ -98,8 +121,6 @@ public class Hardware { buchstabe = this.walzen[0].codiere2(buchstabe); buchstabe = this.steckbrett.codiere(buchstabe); - this.dreheWalzen(); - this.nachricht += buchstabe; return buchstabe; -- GitLab