6

请有人解释下面突出显示的代码行。我完全不明白这条线是如何工作的。

您可以使用此示例来帮助我:

输入:攻击  
关键词:柠檬  
资源:LXFOPV

我不明白那条线如何帮助编码AL其他字母...... ACSII 参与?

static String encrypt(String text, final String key) {
    String res = "";
    text = text.toUpperCase();
    for (int i = 0, j = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c < 'A' || c > 'Z') continue;
 ////////////////////////////////////////////////////////////////////////////
//please someone explain this line
        res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A'); 
////////////////////////////////////////////////////////////////////////

        j = ++j % key.length();
    }
    return res;
}
4

1 回答 1

6

背景

该代码使用字母的 ASCII 值。字母 AZ 是 ASCII 值 65-90。

这个想法是将两个字母加在一起,但如果值超过 90(称为模运算),则回绕。所以 91 实际上应该是 65(即Z + 1 = A)。

Java 提供了一个%运算符来进行模运算 ( x % n)。然而,这被设计用于处理一系列数字 0→<em>n-1。因此,如果我们从每个字母中减去 65,那么我们就在 0→25 的范围内工作。这允许我们使用模运算符 ( x % 26)。

这就是代码正在做的事情:

c + key.charAt(j) - 2 * 'A'

这部分将两个字母相加,但也从它们中减去 65。如果写成这样可能更容易理解:

(c - 'A') + (key.charAt(j) - 'A')

你会注意到你可以- 'A'做为一种方便的做事方式- 65

现在我们有一个从零开始的值,但可能大于 25。所以我们对它取模:

(c + key.charAt(j) - 2 * 'A') % 26

然后我们需要将 65 添加回该值,以将其带回 ASCII 的 AZ 范围:

(c + key.charAt(j) - 2 * 'A') % 26 + 'A'

剩下的唯一步骤是将其强制转换为 a char,因为默认情况下结果是 a int

res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A'); 

例子

如果输入是ATTACK并且关键字是LEMON,那么在某些时候我们将不得不考虑输入字母T(ASCII 84)和键字母M(ASCII 77)。

每个减去 65,我们有 T=19 和 M=12。加在一起,我们得到 31。

31 % 26 = 5. 所以我们然后计算5+65=70,这是 的 ASCII 值 F

于 2015-02-26T09:04:06.560 回答