Ceci est ma première question ici, donc si vous avez quelque chose que je peux améliorer (messages ainsi que le style de codage), je suis heureux de savoir.Chiffrement personnalisé Crypter/Déchiffrer flux
Je sais que mon codage est très efficace, donc je serai ravi de prendre vos conseils et vos améliorations.
Actuellement, j'écris un programme AtbashCipher
, qui doit crypter et décrypter l'entrée String
. Comme pour toutes les tâches à l'Université, il y a quelques lignes directrices, que nous devons suivre, mais je vais d'abord expliquer mon code actuel:
import 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);
}
}
}
Ce code et déchiffre le encrypte inputString, ce qui est encore nécessaire de le remplacer par un scanner d'entrée, mais ce n'est pas un problème. Nous devons apporter les méthodes de décodage et de codage, qui sont fondamentalement les mêmes dans mon code, mais nous devons le découper quand même. Est-ce que je fais quelque chose de mal? (voir modifier, oui, je l'ai fait quelque chose de mal.)
Le problème commence par la tâche: Nous devons écrire une classe AtbashWriter
qui implémente l'java.io.Writer
et après que le constructeur a besoin d'obtenir ces arguments:
public AtbashWriter(Writer base, AtbashCipher cipher)
, nous avons également besoin de passer outre les méthodes write
, flush
et close
, donnés par Java.
public void write(char[] cbuf, int off, int len)
public void flush()
public void close()
Nous devons faire la même chose pour le Reader
ainsi.
J'ai vraiment du mal à comprendre ce concept de créer mon propre Stream
et de l'implémenter dans mon code.
Pouvez-vous m'expliquer comment cela fonctionne et comment mon code pourrait être plus efficace? Erreurs etc.?
Veuillez ne pas simplement lier la bibliothèque java, parce que j'ai quelques difficultés à comprendre le concept des bibliothèques, je recherche toujours quelques exemples.
Cette tâche est de l'Université, mais je ne reçois pas de notes à ce sujet, je veux juste le faire et de pratiquer pour l'examen.
Toute aide est appréciée. Merci :)
Editer: Je ne peux pas éditer la première ligne de mon message, alors ... hey les gars. Edit2: Je viens de voir que mes méthodes ne fonctionnent pas complètement comme je le veux, je vais essayer de les corriger. Edit3: J'ai édité le programme, en essayant de poster l'écrivain peut-être aujourd'hui.
Edit4: en retard, mais toujours pas oublié: je l'ai fini et l'a ajouté ici, problème est résolu :)
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();
}
Merci pour votre réponse, j'y reviendrai demain, parce que je suis trop fatigué pour le moment, mais j'ai changé mon code un peu aussi. – mxOx2kL
Votre analogie l'a rendu plus clair et maintenant je sais comment aborder le problème. Donc le constructeur accepte mon objet chiffré qui contient les différentes valeurs comme la chaîne (?) Et l'auteur écrit simplement tout dans un fichier ou un flux. Je ne comprends pas la différence entre mon chiffre et l'écrivain. Le scénariste n'est-il pas supposé tenir mes cordes codées? Que fait le chiffrement? Merci beaucoup – mxOx2kL
Okay j'ai essayé votre réponse, mais je ne comprends pas complètement la raison derrière le "chiffrement" AtbashCipher et aussi char [] encodedChars = encoder (cbuf, off, len); Ai-je besoin de changer mes méthodes de codage/décodage, afin que je puisse lui donner les arguments requis? Notre méthode d'encodage est (pour autant que je sache) seulement supposée recevoir le char. Merci pour l'aide – mxOx2kL