需要凯撒密码中的代码解释

嘿,最近我的任务是创建一个应用程序,该应用程序读取消息并使用 Java 中的凯撒密码对其进行加密。


直到我遇到添加数字密码会将字母 az/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);

}


万千封印
浏览 92回答 1
1回答

慕森卡

它永远不会允许加密字符超出其假定的范围,即 a - z。a 和 z 的 ascii 分别为 97 和 122,您只希望凯撒密码加密在此字符范围内。这将检查 的 ascii 代码是否ch大于 z 的 ascii代码if(ch&nbsp;>&nbsp;'z'){如果是,它将计算:(ascii of&nbsp;ch) - (ascii of&nbsp;z) + (ascii of&nbsp;a) - 1。ch&nbsp;=&nbsp;(char)(ch&nbsp;-&nbsp;'z'&nbsp;+&nbsp;'a'&nbsp;-&nbsp;1);它被翻译成ch = (char)(ch - 122 + 97 - 1);假设您想用a密钥加密字符3。该程序将采用 97 (ascii of&nbsp;a) + 3。您将得到 100,这是 的 ascii&nbsp;d。然而,如果你想z用密钥加密怎么办3?和以前一样,需要 122 (ascii of&nbsp;z) + 3 = 125。但是,在 97 - 122 (az) 范围内找不到 125。因此,您将得到一个不需要的字符(在本例中,125 是 的 ascii&nbsp;})。因此,(ch - 'z' + 'a' - 1)将确保任何超过 ascii 122 的字符都将被转换回 ascii 范围仅包含 97 和 122 的字符。在 125 的示例中,ch = (char)(125 - 122 + 97 - 1)=>&nbsp;ch = (char)(99)=>&nbsp;ch = c。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java