2016-06-25 11 views
1

Dies ist meine erste Frage hier, wenn Sie also etwas verbessern können (Beiträge sowie Codierung Stil) Ich bin glücklich zu wissen.Benutzerdefinierte Chiffre Verschlüsseln/Entschlüsseln Stream

Ich weiß, dass meine Codierung sehr effizient ist, daher nehme ich gerne Ihre Ratschläge und Verbesserungen.

Momentan schreibe ich ein AtbashCipher Programm, das den Eingang String verschlüsseln und entschlüsseln muss. Wie bei jeder Aufgabe an der Universität gibt es einige Richtlinien, denen wir folgen müssen, aber ich werde meinen aktuellen Code zuerst erklären:

importieren java.util.Scanner;

public class AtbashCipher { 

    StringBuilder code = new StringBuilder(""); 
    String inputString; 
    String coded; 

    public String getInputString() { 
     return this.inputString; 
    } 

    public void setInputString(String inputString) { 
     this.inputString = inputString; 
    } 

    public String getCoded() { 
     return this.coded; 
    } 

    public void setCoded(String coded) { 
     this.coded = coded; 
    } 

    public char encode(char c) { 
     String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     char help = Character.toLowerCase(c); 
     if (alphabet.indexOf(help) >= 0) { 
      for (int i = 0; i < alphabet.length(); i++) { 
       if (help == alphabet.toLowerCase().charAt(i)) { 
        c = alphabet.charAt(26 - i - 1); 
        code.append(c); 
       } 
      } 
     } else { 
      code.append(c); 
     } 

     if (inputString.length() == code.length()) { 
      System.out.println("Encode: " + code); 
      coded = code.toString(); 
      inputString = coded; 
      code.setLength(0); 
     } 
     return c; 
    } 

    public char decode(char c) { 
     String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     char help = Character.toLowerCase(c); 
     if (alphabet.indexOf(help) >= 0) { 
      for (int i = 0; i < alphabet.length(); i++) { 
       if (help == alphabet.toLowerCase().charAt(i)) { 
        c = alphabet.charAt(26 - i - 1); 
        code.append(c); 
       } 
      } 
     } else { 
      code.append(c); 
     } 

     if (inputString.length() == code.length()) { 
      coded = code.toString(); 
      inputString = coded; 
      System.out.println("Decode: " + code); 
      code.setLength(0); 
     } 
     return c; 
    } 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     AtbashCipher atb = new AtbashCipher(); 
     System.out.print("To be translated: "); 
     atb.setInputString(sc.nextLine()); 
     sc.close(); 
     for (int j = 0; j < atb.getInputString().length(); j++) { 
      char help = atb.getInputString().charAt(j); 
      atb.encode(help); 
     } 
     for (int k = 0; k < atb.getInputString().length(); k++) { 
      char help = atb.getInputString().charAt(k); 
      atb.decode(help); 
     } 
    } 
} 

Dieser Code verschlüsselt und entschlüsselt die input, die braucht, ist nach wie vor mit einem Scanner-Eingang zu ersetzen, aber das ist kein Problem. Wir müssen die Methoden decode und encode einbringen, die im Prinzip in meinem Code identisch sind, aber wir müssen sie trotzdem teilen. Mache ich etwas falsch? (siehe bearbeiten, ja, ich etwas falsch gemacht habe.)

Das Problem mit der Aufgabe beginnt: Wir brauchen eine Klasse AtbashWriter zu schreiben, die die java.io.Writer und nach diesem implementiert, muss der Konstrukteur diese Argumente erhalten:

public AtbashWriter(Writer base, AtbashCipher cipher) 

Außerdem müssen wir die write, flush und close Methoden von Java gegeben außer Kraft zu setzen.

public void write(char[] cbuf, int off, int len) 
public void flush() 
public void close() 

Wir müssen das gleiche gilt für die Reader auch tun.

Ich habe wirklich Mühe, hinter dieses Konzept der Erstellung meiner eigenen Stream zu kommen und es in meinen Code zu implementieren.

Können Sie mir bitte erklären, wie das funktioniert und wie mein Code effizienter sein könnte? Fehler usw.?

Bitte verbinden Sie nicht nur die Java-Bibliothek, weil ich einige Schwierigkeiten habe, das Konzept von Bibliotheken zu verstehen, sehe ich immer einige Beispiele nach.

Diese Aufgabe ist von der Universität, aber ich bekomme keine Noten dazu, ich will es nur tun und für die Prüfung üben.

Jede Hilfe wird geschätzt. Danke :)

Edit: Ich kann die erste Zeile meines Beitrags nicht bearbeiten, also ... hey Leute. Edit2: Ich habe gerade gesehen, dass meine Methoden NICHT so funktionieren, wie ich sie will, ich werde versuchen, sie zu korrigieren. Edit3: Ich habe das Programm bearbeitet und versucht, den Writer vielleicht heute zu posten.

Edit4: Spät, aber immer noch nicht vergessen: Ich habe es fertig und fügte hinzu, es hier, Problem gelöst :)

private Reader base; 
private AtbashCipher cipher; 

public AtbashReader(Reader base, AtbashCipher cipher) { 
    this.base = base; 
    this.cipher = cipher; 
} 

public int read (char[] cbuf, int off, int len) throws IOException{ 
    int result= base.read(cbuf, off, len); 

    for(int i = off; i < (off+len); i++){ 
     cbuf[i] = cipher.decode(cbuf[i]); 
    } 
    return result; 
} 

public void close()throws IOException { 
    base.close(); 
} 

Antwort

1

Ich werde versuchen, eine Analogie zu machen. Angenommen, Sie haben bereits eine Maschine, die Autos neu streichen kann. Es ist einfach: Sie geben ihm ein Auto, und die Maschine malt es. Diese Maschine entspricht einer Writer, die ein Char-Array nimmt und schreibt.

Jetzt ist das Problem, dass Autos vor dem Lackieren gewaschen werden müssen. Also, wie könnten Sie eine Maschine bauen, die Autos wäscht und dann malt. Sie könnten eine neue Maschine von Grund auf neu erstellen. Oder Sie könnten einfach eine Maschine bauen, die die Lackiermaschine wiederverwendet. Deine Maschine würde ein Auto nehmen, es waschen (das ist deine Aufgabe) und dann das gewaschene Auto der bereits existierenden Maschine geben. Diese große Maschine ist Ihre AtbashWriter: Es schreibt Char-Arrays, aber bevor Sie sie schreiben, codiert es sie. Und wie macht es das? Indem Sie das char-Array codieren und es dann an die Maschine übergeben, die bereits weiß, wie sie schreiben soll: den Basis-Writer.

Also, im Grunde Ihre Methode write() sollte wie folgt aussehen:

public void write(char[] cbuf, int off, int len) { 
    // transform the dirty car into a washed car 
    char[] encodedChars = encode(cbuf, off, len); 

    // paint the washed car 
    baseWriter.write(encodedChars, 0, encodedChars.length); 
} 

Hoffentlich dies sollten Sie gestartet.

+0

Vielen Dank für Ihre Antwort, ich werde es morgen untersuchen, weil ich im Moment zu müde bin, aber ich habe meinen Code auch ein bisschen geändert. – mxOx2kL

+0

Ihre Analogie machte es klarer und jetzt weiß ich, wie man das Problem angeht. Also akzeptiert der Konstruktor mein Cipher-Objekt, das die verschiedenen Werte wie den String (?) Enthält, und der Writer schreibt einfach alles in eine Datei oder einen Stream. Ich verstehe irgendwie nicht den Unterschied zwischen meiner Chiffre und dem Writer. Soll der Writer nicht meine codierten Strings halten, was macht die Chiffre? Vielen Dank – mxOx2kL

+0

Okay, ich habe Ihre Antwort ausprobiert, aber ich verstehe nicht vollständig den Grund hinter dem AtbashCipher "Cipher" und auch char [] encodedChars = encode (cbuf, off, len); Muss ich meine Kodierungs-/Dekodierungsmethoden ändern, damit ich die erforderlichen Argumente angeben kann? Unsere Encoder-Methode ist (soweit ich weiß) nur dazu gedacht, den Char zu erhalten. Vielen Dank für die Hilfe – mxOx2kL