2016-06-25 35 views
1

これは私の最初の質問です。何か改善していれば(投稿とコーディングスタイル)、私は知ってうれしいです。カスタム暗号化暗号化/復号化ストリーム

私はコーディングが非常に効率的であることを知っていますので、喜んでアドバイスと改善を行います。

現在、Stringの暗号化と復号化を行うAtbashCipherプログラムを作成しています。大学のすべてのタスクと同様に、私たちが従う必要があるいくつかのガイドラインがありますが、私は現在のコードをまず説明します:

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からの、暗号化および復号化します。 私のコードでは基本的に同じであるメソッドのデコードとエンコードを行う必要がありますが、それをどうにか分割する必要があります。私は何か間違っているのですか? は(編集を参照してください、はい、私が何か間違ったことをしました。)

問題は、タスクを開始します。私たちは、java.io.Writerを実装し、その次は、コンストラクタは、これらの引数を取得する必要がクラスAtbashWriterを記述する必要が :

public AtbashWriter(Writer base, AtbashCipher cipher) 

また、Javaによって与えられたwrite,flushおよびのメソッドを上書きする必要があります。

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

Readerについても同じことを行う必要があります。

私は実際に自分自身のStreamを作成し、それを自分のコードに実装するこのコンセプトの背後にいるのを苦労しています。

あなたはそのことがどのように機能し、私のコードがより効率的になるのかを教えてください。エラーなど?

私はライブラリのコンセプトを理解するのにいくつかの困難がありますので、私はいつもいくつかの例を調べます。

このタスクは大学からのものですが、私はこれに任意の成績を取得していない、私はちょうどそれを行い、試験のために練習したい。

すべての援助をいただきありがとうございます。 ありがとうございました:)

編集:私の投稿の最初の行は編集できませんので、...ねえ。 Edit2:私のメソッドが完全に機能していないことがわかりました。それらを修正しようとします。 Edit3:私は今作家を投稿しようとすると、プログラムを編集しました。

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に相当し、char配列をとり、それを書き込みます。

今、車は塗装される前に洗濯する必要があるという問題があります。だから、車を洗う機械をどうやって作って、それを塗ることができますか?最初から新しいマシンを作ることができます。あるいは、塗装機を再利用するマシンを作ることもできます。あなたのマシンは車を取ってそれを洗って(それはあなたの仕事です)、洗濯した車をすでに存在するマシンに渡します。この大きなマシンはAtbashWriterです:char配列を書き込みますが、書き込む前にエンコードします。そしてそれはどうやって? char配列をエンコーディングし、次にそれをすでに書き方を知っているマシンに渡します:ベースのWriter。

だから、基本的に、あなたのwrite()メソッドは次のようになります。

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

あなたの類推によって、それがより明確になりました。そして今、私は問題に取り組む方法を知っています。 コンストラクタは文字列(?)のようなさまざまな値を含む暗号オブジェクトを受け取り、Writerはすべてをファイルまたはストリームに書き込んでいます。 私は何とか私の暗号と作家の違いを理解していません。作者が私のコード化された文字列を保持していないのですか?暗号は何をしていますか? ありがとうございます – mxOx2kL

+0

私はあなたの答えを試しましたが、私はAtbashCipher "cipher"の背後にある理由を完全に理解していません。また、 char [] encodedChars = encode(cbuf、off、len); エンコード/デコードメソッドを変更する必要があるので、必要な引数を与えることができますか?私たちのエンコードメソッドは、(私が知る限り)charを受け取ることになっています。 ありがとうございました – mxOx2kL