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();
}
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
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
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