以下代码以Caesar的方式加密单词或句子。你把移位值和程序取出单词/句子的每个字母,并根据移位(键)值在字母表中“移动”。但这不是问题。 我在互联网上找到了代码,我无法解释其中的一些内容。 我知道它是如何工作的,但我需要一些关于它的一些特定答案。 这是代码:
import acm.program.*;
public class CaesarCipher extends ConsoleProgram {
public void run() {
println("This program implements a Caesar cipher.");
int key = readInt("Character positions to shift: ");
String plaintext = readLine("Enter a message: ");
String ciphertext = encodeCaesarCipher(plaintext, key);
println("Encoded message: " + ciphertext);
}
private String encodeCaesarCipher(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);
if (Character.isLetter(ch)) {
if (Character.isUpperCase(ch)) {
ch = (char) ('A' + (ch - 'A' + key) % 26);
}
else {
ch = (char) ('a' + (ch - 'a' + key) % 26);
}
}
result += ch;
}
return result;
}
}
这些线究竟是什么意思,他们如何做他们的工作?
ch = (char) ('A' + (ch - 'A' + key) % 26);
和
ch = (char) ('a' + (ch - 'a' + key) % 26);
答案 0 :(得分:5)
这两行的行为相同,除了一个适用于大写,一个适用于小写的事实。我将在这里解释大写操作。请注意,这些char
值将被视为int
,直到下面的第6步。
ch = (char) ('A' + (ch - 'A' + key) % 26);
ch - 'A'
给出了首字母int
与首都A的偏移。ch - 'A' + key
将偏移量增加key
,从而创建加密字符与大写字母A的偏移量。(ch - 'A' + key) % 26
:此处的模数确保加密字符的数值为0-25(对于字母表中的26个字母),防止字母“溢出”。该表达式的值现在是加密字符与大写字母A的标准化偏移量。'A' + (ch - 'A' + key) % 26
将加密字符从大写字母A的偏移量添加到大写字母A本身,从而产生加密字符的int
值。(char) ('A' + (ch - 'A' + key) % 26)
将int
转换为char
类型,从而将加密字符设为char
。此代码将字母表的开头(大写字母A)视为“起始点”,从中测量每个字母的偏移量。偏移量是字符从'A'开始的字母数。
示例:使用6:
键来加密“E”69 - 65 = 4
。4 + 6 = 10
。这是来自A加密字符的字母数。10 % 26 = 10
(由于起始字母小+小键无效)'A' + 10 = 65 + 10 = 75
会产生加密字符的ASCII码,75('K')char
可以将其视为字符,而不是int
。答案 1 :(得分:2)
它将字符转换为ASCII等效字符,由+运算符表示(不能添加字符,只能添加数字),然后将字符更改一定数量的值。 (char)
正在将结果转换(转换)回字符,以便您可以将其分配给ch
。
'A的ASCII值为65,ch
是当前在字符串中位置i
处计算的字符。 ch = (char) ('A' + (ch - 'A' + key) % 26);
的计算结果为'65 +(字符的ASCII码 - 65 +键)%26'。然后将此结果强制转换为字符并分配给ch
。模数(%)运算符取一个数字,除以第二个数字,在本例中为26,并返回余数(5%6为5,而7%3为1)。第二个语句以相同的方式工作,但使用小写'a'(97)而不是大写'A'。
有关ASCII键的信息,请参阅此页:http://www.asciitable.com/