-4

所以在我的程序中,我应该有一个驱动程序类和实用程序类。我必须编写一个使用与 Caesar 相同类型的密码学的程序。例如 a = f、b = g、c = h 等等。在我的驱动程序类中,我应该进行解码和编码过程。该文件必须使用命令行参数进行加密/解密。例如,

java CaesarLab 编码“关键字”message.txt

在实用程序类中应该是字母的移动。这是我知道放置此代码的地方:

public static final int NUM_LETTERS = 26;

// shifting up for the encoding process
public static char shiftUpByK(char c, int k) {
   if ('a' <= c && c <= 'z')
       return (char) ('a' + (c - 'a' + k) % NUM_LETTERS);
   if ('A' <= c && c <= 'Z')
       return (char) ('A' + (c-'A' + k) % NUM_LETTERS);
   return c; // don't encrypt if not an alphabetic character
}

 // shifting down for the decoding process
 public static char shiftDownByK(char c, int k) {
     return shiftUpByK(c, NUM_LETTERS - k);
}

它还应该从 FileInputStream 中读取,并通过捕获所有 I/O 异常来处理异常/错误。

这个程序似乎有很多组件,我很难把它们放在一起。如果我能在整理所有这些方面得到一些帮助,将不胜感激。

4

1 回答 1

-1

我为您制作了一个小骨架,以具体了解那些“许多组件”可能是什么。您已经有了驱动程序 - 假设您在CaesarDriver.java.

使用该“驱动程序”的实用程序现在看起来像这样:

import java.io.PrintWriter;
import java.util.Scanner;

/**
 * This is a utility class allows to encrypt/ decrypt the data received by a Scanner {@see Scanner} using the caesar
 * encoding by providing the key to be used.
 *
 * Note: Behind the scanner there may be a File or System.in as source
 */
public class CaesarUtility {

    /**
     * TODO: implement a mechanism to encrypt data ({@see Scanner}) and write the encrypted data out ({@see PrintWriter})
     * TODO: use the provided key for encryption
     * @param in source for the data to be encrypted {@see Scanner}
     * @param out destination for the encrypted data to be written to {@see PrintWriter}
     * @param key key to be used for the encryption
     */
    public static void encrypt (Scanner in, PrintWriter out, String key){

        // TODO: do we need to validate something? Could something be null? Do we need to care about this?

        // TODO: Read from Scanner
        String dataToEncrypt = "TODO: Read from Scanner";

        // TODO: Encryption
        String encryptedData = "Use your existing Caesar Driver with the correct method to encrypt the data";

        // TODO: Write encrpyted data using the provided PrintWriter
    }

    /**
     * TODO: The same like in encrypt but decrypt data this time
     * @param in source for the data to be decrypted {@see Scanner}
     * @param out destination for the decrypted data to be written to {@see PrintWriter}
     * @param key key to be used for the decryption
     */
    public static void decrypt (Scanner in, PrintWriter out, String key){

        // TODO: Basicially the same but for decryption (e.g. you will use your driver slightly different here :))

    }
}

允许这样使用世界:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

/**
 *  Hello i am a Application that is too lazy to implement the Caesar encoding/ decoding - luckaly someone
 *  made me a Utility for that :)
 *
 *  TODO: This could need some improvement - maybe let the user type in the in/output file in the console?
 *
 */
public class Application {

    // TODO: How i said i am a bit rosty here - was it a number or a character - you know it better than i do i assume :)
    private static final String KEY = "???";

    public static void main(String[] args){
          new Application().start();
    }

    public void start(){

         // lets first encode a file - we need to have a Scanner to be able to use the Utility class (so i searched)
         // SO for "Java Scanner read File" and found this:
        File inputFile = new File("sensitive-data.txt");
        Scanner inputScanner = null;

        try {
            new Scanner(inputFile);
        } catch (FileNotFoundException e) {
            // TODO: Exception handling (does it make sence to proceed in this case? do we have to notify the user about this?
            e.printStackTrace();
        }

        // let the utility encode the file and write it to another file - luckaly searching SO for "Java PrintWriter example"
        // helps us out here
        File outFile = new File ("sensitive-data.txt");
        PrintWriter outWriter = null;
        try {
            outWriter = new PrintWriter (outFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // Alright we have both - the input as well as the output and the key - its time to let the utility do its work
        CaesarUtility.encrypt(inputScanner, outWriter, KEY);

        // TODO: Whoopy i accidentially overwritten the source file with encoded data - luckaly i am able to decode it again
        // TODO: Decode the encoded file before the boss asks about the next sensitive-data report :)

    }
}

我希望这可以支持您进一步深入研究任务 - 当您下次遇到困难时,请随时使用您的所有代码更新您的答案(它至少可以让您从现在开始提出更具体的问题,这样您就不会被否决地面)。

于 2015-03-04T08:43:47.767 回答