Нужно объяснение кода в Цезарь шифра - PullRequest
0 голосов
/ 12 октября 2019

Эй, недавно я получил задание на создание приложения, которое читает сообщение и зашифровывает его с помощью шифра Цезаря в Java.

У меня действительно не было проблем, пока я не дошел до части, где добавлениецифровой шифр перенесет вас через буквы z / AZ в специальные символы, и я действительно не знаю, что делать.

Вот код моего решения:

private String caesarCipher(String message) {
    Scanner input = new Scanner(System.in);
    StringBuilder cipher = new StringBuilder();
    char ch;
    int key;

    System.out.print("Enter a key: ");
    key = Integer.parseInt(input.nextLine());

    for(int i = 0; i < message.length(); i++) {
        ch = message.charAt(i);
        if(ch >= 'a' && ch <= 'z'){
            ch = (char)(ch + key);

            if(ch > 'z'){
                ch = (char)(ch - 'z' + 'a' - 1);
            }

            cipher.append(ch);
        }
        else if(ch >= 'A' && ch <= 'Z'){
            ch = (char)(ch + key);

            if(ch > 'Z'){
                ch = (char)(ch - 'Z' + 'A' - 1);
            }

            cipher.append(ch);
        }
        else {
            cipher.append(ch);
        }
    }

    return cipher.toString();
}

Может кто-нибудь объяснить, пожалуйстадля меня процесс и обоснование следующего утверждения:

if(ch > 'z'){
    ch = (char)(ch - 'z' + 'a' - 1);
}

1 Ответ

0 голосов
/ 12 октября 2019

Он никогда не позволит зашифрованному символу превысить предполагаемый диапазон, то есть a - z. Значения ascii для a и z равны 97 и 122 соответственно, и вам потребуется шифрование Цезаря только в этом диапазоне символов.

Это позволит проверить, больше ли код ascii ch, чем asciiz

if(ch > 'z'){

Если да, будет вычислено: (ASCII ch) - (ASCII z) + (ASCII a) - 1.

ch = (char)(ch - 'z' + 'a' - 1);

Он переведен на ch = (char)(ch - 122 + 97 - 1);

Предположим, вы хотите зашифровать символ a ключом 3. Программа примет 97 (ASCII a) + 3. Вы получите 100, что является ASCII d. Но что если вы хотите зашифровать z ключом 3?

То же, что и раньше, потребуется 122 (ascii of z) + 3 = 125. Однако 125 не найден в диапазоне 97 - 122 (az). Таким образом, вы получите нежелательный символ (в данном случае 125 - это ascii }).

Следовательно, (ch - 'z' + 'a' - 1) обеспечит преобразование любого персонажа, превосходящего ascii 122, обратно в персонажа. с диапазоном ASCII 97 и 122 включительно только. В примере 125 ch = (char)(125 - 122 + 97 - 1) => ch = (char)(99) => ch = c.

...