5

下面的代码以凯撒的方式加密一个单词或句子。您输入移位值,程序会根据移位(键)值获取单词/句子的每个字母并在字母表中“移动”。但这不是问题。我在互联网上找到了代码,我无法解释其中的一些行。我知道它是如何工作的,但我需要一些关于它的一些行的具体答案。这是代码:

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);
4

2 回答 2

5

这两行的行为相同,除了一个适用于大写,一个适用于小写这一事实。我将在这里解释大写操作。请记住,在下面的第 6 步之前,这些char值都被视为ints。

ch = (char) ('A' + (ch - 'A' + key) % 26);
  1. ch - 'A'给出初始字符int与大写字母 A 的偏移量.
  2. ch - 'A' + key将偏移量增加key,创建加密字符与大写字母 A 的偏移量。
  3. (ch - 'A' + key) % 26:这里的模确保加密字符的数值为0-25(对于字母表中的26个字母),防止字母表“溢出”。该表达式的值现在是加密字符与大写字母 A 的标准化偏移量。
  4. 'A' + (ch - 'A' + key) % 26将加密字符从大写字母 A 到大写字母 A 本身的偏移量相加,得到加密字符的int值。
  5. (char) ('A' + (ch - 'A' + key) % 26)将其转换intchar类型,从而将加密字符作为char.

此代码将字母表的开头(大写字母 A)视为“起点”,从该起点开始测量每个字母的偏移量。偏移量是字符从“A”开始的字母数。

示例:使用密钥 6 加密“E”:

  1. 找出“E”和大写字母A之间的字母数。A 的 ASCII 码是 65,E 的码是 69。要找到 E 与 A 的偏移量,请减去69 - 65 = 4
  2. 添加偏移量和键:4 + 6 = 10. 这是加密字符将是来自 A 的字母数。
  3. 10 % 26 = 10(因为小开头字母+小键没有效果)
  4. 'A' + 10 = 65 + 10 = 75得到加密字符的 ASCII 码,75 ('K')
  5. 将 75 转换为char允许将其视为一个字符,而不是一个int.
于 2013-12-27T01:34:27.077 回答
2

它将字符转换为 ASCII 等价物,如 + 运算符所示(您不能添加字符,只能添加数字),然后将字符更改为一定数量的值。正在将(char)结果转换(转换)回字符,以便您可以将其分配给ch.

'A 的 ASCII 值是 65,并且ch是当前i在字符串中的位置被评估的字符。 ch = (char) ('A' + (ch - 'A' + key) % 26);计算结果为 '65 + (字符的 ASCII 数字 - 65 + key) % 26'。然后将此结果转换回一个字符并分配给ch. 模 (%) 运算符取一个数字,将其除以第二个数字,在本例中为 26,然后返回余数(5 % 6 为 5,而 7 % 3 为 1)。第二条语句的工作方式相同,但使用小写字母 'a' (97) 而不是大写字母 'A'。

有关 ASCII 密钥,请参阅此页面:http ://www.asciitable.com/

于 2013-12-27T01:36:59.567 回答