java - 需要解释凯撒密码中的代码
问题描述
嘿,最近我的任务是创建一个应用程序,该应用程序可以读取消息并使用 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);
}
解决方案
它绝不会允许加密字符超出其假定范围,即 a - z。a 和 z 的 ascii 分别为 97 和 122,并且您只希望在此字符范围内进行凯撒密码加密。
这将检查 ascii 代码ch
是否大于 z 的 ascii
if(ch > 'z'){
如果是,它将计算:(ascii of ch
) - (ascii of z
) + (ascii of a
) - 1。
ch = (char)(ch - 'z' + 'a' - 1);
它被翻译成ch = (char)(ch - 122 + 97 - 1);
假设您想a
用 key加密字符3
。该程序将占用 97 (ascii of a
) + 3。您将得到 100,即d
. 然而,如果你想z
用密钥加密3
怎么办?
和以前一样,它需要 122 (ascii of z
) + 3 = 125。但是,在 97 - 122 (az) 范围内找不到 125。因此,您会得到一个不需要的字符(在这种情况下,125 是 的 ascii }
)。
因此,(ch - 'z' + 'a' - 1)
将确保任何超过 ascii 122 的字符都将被转换回 ascii 范围仅为 97 和 122 的字符。在 125 的示例中,ch = (char)(125 - 122 + 97 - 1)
=> ch = (char)(99)
=> ch = c
。
推荐阅读
- visual-studio-code - 终端进程无法在 VSCode (macOS) 中启动
- html -
在 Android 的 MS 团队选项卡中无法正常工作 - reactjs - 将 netlify 安装到我的反应应用程序时无法识别错误“ntl”
- c++ - 我的 C++ 程序如何等到对命名管道进行新的写入?
- api - 使用 services/data/v48.0/connect/files/users/me (Salesforce) 将文件上传到客户端组织
- git - 通过 Azure Devops 上的 api 检索 git 分支内容
- javascript - openssl_decrypt PHP 到 CryptoJS
- r - 仅计算以 .... 开头的行(在 R 中)
- mysql - 试图通过工作台连接到mysql数据库但工作台没有打开
- vue.js - 来自 Prop 变量的 Vue 条件类