实际上,如果使用代码[A],则运行失败。我不明白为什么。我也不明白第一个'A'然后+'A'。为什么[A]失败了? [B]好吗?
Code [A] (char) (ch + key) % 26 )
Code [B] (char) ('A' + ((ch -'A' + key) % 26))
public void run() {
setFont("Arial-PLAIN-24");
String line = readLine ("Enter line: ");
int key = readInt ("Enter key: ");
String siphertext = encryptCaesar(line , key);
println("The result is: " + siphertext);
String newplain = encryptCaesar(siphertext , -key);
println("newplain:" + newplain);
}
private String encryptCaesar(String str , int key){
if(key < 0){
key = 26 - ( -key % 26 );
}
String result = "";
for(int i = 0; i < str.length(); i++){
char ch = str.charAt(i);
result += encryptChar(ch,key);
}
return result;
}
/**Why can't use ( (ch + key) % 26 )*/
private char encryptChar(char ch, int key){
if(Character.isUpperCase(ch)){
return ( (char) ('A' + ((ch -'A' + key) % 26)) );
}
return ch;
}
答案 0 :(得分:2)
如果我理解你的要求......
此处'A'
的功能是将字符转换为与字母表中序号位置对应的数字。
表达式(ch -'A' + key) % 26
将产生0到25范围内的值,具体取决于字符的序号位置和键变量的值。
答案 1 :(得分:1)
[A]表单提供0
和25
之间的值,[B]表单为您提供'A'
和'Z'
之间的值。他们显然不是同一个词。
如果你从这个角度阅读这两个表格,首先在[B]形式中使用'A'
是为了确保结果值保持在'A'
到{{1}的范围内}}。
减去'Z'
的第二个用途是需要正确实施凯撒加密。如果删除它,最终将使用不同的加密方式。 ('A'
确保- 'A'
选择字母表的key
轮次。没有它,您的key
将实际计算encryptCaesar(a, key)
;即凯撒加密一把不同的钥匙。)
但如果您“手动执行”代码的两个版本以查看它们如何将输入字符映射到输出字符,那么这一切都应该是显而易见的。