Это мой первый вопрос, поэтому, если у вас есть все, что я могу улучшить (сообщения, а также стиль кодирования), я рад узнать.Custom Cipher Encrypt/Decrypt Stream
Я знаю, что мое кодирование очень эффективно, поэтому я с радостью возьму ваши советы и улучшения.
В настоящее время я пишу программу AtbashCipher
, которая должна шифровать и расшифровывать ввод String
. Как и в каждом задании в Университете, есть некоторые рекомендации, которые нам нужно выполнить, но я сначала объясню свой текущий код:
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);
}
}
}
Этот код шифрует и расшифровывает inputString, который по-прежнему необходимо заменить сканер-Input, но это не проблема. Нам нужно принести методы декодировать и кодировать, которые в моем коде одинаковы, но мы все равно должны разбить его. Я делаю что-то неправильно? (см редактировать, да, я сделал что-то не так.)
Проблема начинается с задачи: Нам нужно написать класс AtbashWriter
, который реализует java.io.Writer
и после этого, конструктор должен получить эти аргументы:
public AtbashWriter(Writer base, AtbashCipher cipher)
Кроме того, мы должны переопределить write
, flush
и close
методы, предоставляемые Java.
public void write(char[] cbuf, int off, int len)
public void flush()
public void close()
Нам необходимо сделать то же самое для Reader
.
Я действительно пытаюсь справиться с этой концепцией создания своего собственного Stream
и внедрения его в свой код.
Не могли бы вы объяснить мне, как это работает и как мой код может быть более эффективным? Ошибки и т. Д.?
Просьба не просто связывать библиотеку java, потому что у меня есть некоторые трудности при понимании концепции из библиотек, я всегда ищу некоторые примеры.
Эта задача из Университета, но я не получаю оценки по этому поводу, я просто хочу это сделать и практиковать для экзамена.
Каждая помощь приветствуется. Спасибо :)
Редактировать: Я не могу отредактировать первую строчку своего сообщения, так что ... эй, ребята. Edit2: Я только что увидел, что мои методы НЕ функционируют так, как я их хочу, я попытаюсь исправить их. Edit3: Я редактировал программу, пытаясь опубликовать Writer, возможно, сегодня.
Edit4: Поздно, но до сих пор не забыл: я закончил его и добавить его здесь, проблема решена :)
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();
}
Спасибо за ваш ответ, я загляну в него завтра, потому что я слишком устал в данный момент, но я тоже изменил свой код. – mxOx2kL
Ваша аналогия сделала ее более ясной, и теперь я знаю, как решить эту проблему. Итак, конструктор принимает мой объект шифрования, который содержит различные значения, такие как String (?), И Writer просто записывает все в файл или поток. Я как-то не понимаю разницы между моим шифром и писателем. Разве Писатель не должен хранить мои закодированные строки? Что делает шифр? Спасибо большое – mxOx2kL
Хорошо, я попробовал ваш ответ, но я не совсем понимаю причину шифрования AtbashCipher, а также char [] encodedChars = encode (cbuf, off, len); Нужно ли мне менять методы кодирования/декодирования, поэтому я могу дать ему необходимые аргументы? Наш метод кодирования (насколько я знаю) должен только принимать char. Благодарим за помощь – mxOx2kL