-1

txt ファイルを暗号化しようとしていますが、文字を配列に送信するとスペースが失われます。句読点や文字の大文字小文字と一緒にスペースを保持したい。私はとても近いですが、A.) すべてがヌル文字になるか、B.) ループ大文字にならないようなことは何もできないようです。前もって感謝します。

public class Encryption {
     CaesarCipher c= new CaesarCipher();
     Scanner kb = new Scanner(System.in);
     String end = "";

public void changeLetters(File file) {
    System.out.println("How far would you like to shift?");
    int shift = Integer.parseInt(kb.nextLine());
    Scanner fileScanner;
    try {
        fileScanner = new Scanner(file);
        while (fileScanner.hasNextLine()) {
            String line = fileScanner.nextLine();
            shift(line, shift);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

private void shift(String line, int shift) {
    char[] og = line.toCharArray();
    for (int i = 0; i < og.length; i++) {
        char letter = og[i];
        letter = (char) (letter + shift);
        if (letter > 'z') {
            letter = (char) (letter - 26);
        } else if (letter < 'a') {
            letter = (char) (letter + 26);
        }
        end = end + Character.toString(letter);
    }
    System.out.println(end);

    File file = new File("Encrypted.txt");
    FileWriter writer = null;

    {
        try {
            writer = new FileWriter(file);
            writer.write(end);
            writer.close();
        } catch (

        IOException e)

        {
            e.printStackTrace();
        }
        System.out.println("Decryption Complete");
        System.out.println("Q to quit, C to Continue");
        String response = kb.next();
        if (response.equals("q") || response.equals("Q")) {
            System.out.println("Goodbye");
        } else if (response.equals("c") || response.equals("C")) {
            c.getInformation();
        }
    }
}
4

1 に答える 1

0

問題は、たとえばletter = (char) (letter - 26);. これは、アルファベット [az] 内でのみ機能します。ただし、大文字や特殊文字などを処理できるようにしたいので、これはできません。

これを行うには、モジュロ演算子を使用する方がクリーン%です。したがって、行ったように明示的なテストを行う必要はありませんif (letter > 'z')

これが本当に簡単なシフト手順です

private String shift(String str, int shift) {
    String shifted = "";
    for(int i = 0; i < str.length(); i++) {
        char original = str.charAt(i);
        char shiftedChar = (char) ((original + shift) % Integer.MAX_VALUE);
        shifted += shiftedChar; // Append shifted character to the end of the string
    }

    return shifted;
}

ただし、これが使用するモジュラスかどうかはわかりません。しかし、私はいくつかのテストを行いましたが、これはうまくいくようです。

シフトとシフト解除の方法は次のとおりです。

String test = "This is a test!";
String encoded = shift(test, 3);
String decoded = shift(encoded, -3);

System.out.println("Encoded : " + encoded + "\n" + "Decoded : " + decoded);
于 2015-10-08T20:23:55.433 に答える