2016-06-25 2 views
1

Это мой первый вопрос, поэтому, если у вас есть все, что я могу улучшить (сообщения, а также стиль кодирования), я рад узнать.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(); 
} 

ответ

1

Попробую провести аналогию. Предположим, у вас уже есть машина, способная перекрашивать автомобили. Это просто: вы даете ему машину, и машина ее рисует. Этот аппарат является эквивалентом Writer, который принимает массив символов и записывает его.

Проблема в том, что перед окрашиванием необходимо стирать машины. Итак, как вы могли бы сделать машину, которая моет машины, а затем рисует ее. Вы можете построить новую машину с нуля. Или вы можете просто создать машину, которая повторно использует машину для рисования. Ваша машина возьмет машину, вымоет ее (это ваша работа), а затем отдайте промытый автомобиль уже существующей машине. Эта большая машина - ваш AtbashWriter: он записывает массивы символов, но перед их написанием он кодирует их. И как это делается? Кодируя массив символов, а затем передавая его на машину, которая уже знает, как писать: базовый Writer.

Таким образом, в основном, ваш метод записи() должен выглядеть следующим образом:

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

Будем надеяться, что это поможет вам начать.

+0

Спасибо за ваш ответ, я загляну в него завтра, потому что я слишком устал в данный момент, но я тоже изменил свой код. – mxOx2kL

+0

Ваша аналогия сделала ее более ясной, и теперь я знаю, как решить эту проблему. Итак, конструктор принимает мой объект шифрования, который содержит различные значения, такие как String (?), И Writer просто записывает все в файл или поток. Я как-то не понимаю разницы между моим шифром и писателем. Разве Писатель не должен хранить мои закодированные строки? Что делает шифр? Спасибо большое – mxOx2kL

+0

Хорошо, я попробовал ваш ответ, но я не совсем понимаю причину шифрования AtbashCipher, а также char [] encodedChars = encode (cbuf, off, len); Нужно ли мне менять методы кодирования/декодирования, поэтому я могу дать ему необходимые аргументы? Наш метод кодирования (насколько я знаю) должен только принимать char. Благодарим за помощь – mxOx2kL