-1

有人可以告诉我这个特定的行在做什么结果 = 结果行和它之后的行,我需要对这两行进行解释。没看清楚。从网上得到的。

这是完整的代码

static String vigencrypt(String plain, final String key) 
{
    String result = "";
    plain = plain.toUpperCase();
    int length = plain.length();
    for (int i = 0, j = 0; i < length; i++)
    {
        char chr = plain.charAt(i);
        if (chr < 'A' || chr > 'Z') continue;
        result = result +(char)((chr + key.charAt(j) - 2 * 'A') % 26 + 'A');
        j = ++j % key.length();
    }
    return result;
}

不明白这两行的作用是有人可以帮助我

  result = result +(char)((chr + key.charAt(j) - 2 * 'A') % 26 + 'A');
  j = ++j % key.length();
4

1 回答 1

3

让我们逐行浏览:

result = result + // Concatenate the current string in result with
(char)((chr + key.charAt(j) - 2 * (65)) % 26 + 'A'); // this guy

让我们分解这部分,首先将A其转换为 65 的十进制表示(这些操作会将字符转换为整数 - 请参阅此答案):

(char)((chr + key.charAt(j) - 2 * (65)) % 26 + (65));

变成

(char)((plain.charAt(i) + key.charAt(j) - 130) % 26 + 65);

因此,它将当前纯文本字符的值添加到当前键字符的值中。假设角色都是z- 这给了我们

(char)((z + z - 130) % 26 + 65)

现在用z十进制表示替换 s

(char)((122 + 122 - 130) % 26 + 65)
(char)(114 % 26 + 65)
(char)(10 + 65)
(char)(75)
'K'

如果它恰好是字母范围的另一端('A' == 65再次)怎么办?

(char)((65 + 65 - 130) % 26 + 65)
(char)(0 % 26 + 65)
(char)(0 + 65)
(char)(65)
'A'

其他字符组合将编码为其他字符。

(char)(('z' + 'A' - 130) % 26 + 65)
(char)((122 + 65 - 130) % 26 + 65)
(char)(57 % 26 + 65)
(char)(5 + 65)
(char)(70)
'F'

因此,有问题的第一行是将下一个纯文本字符(在 index 处i)添加到下一个关键字符(在 index 处j,如果明文多于关键字符,则循环)。它减去 130(我不知道为什么——也许是为了确保它在标准的 ASCII 码页面上?),然后模 26 并加上 65 以确保它会从 AZ 输出一个字符,仅大写。此结果附加到先前的结果。

至于第二行,这是我们确定下一个关键字符的索引的地方。它将向上移动一个字符,而模确保索引将循环回到开头而不是超出键长度。可能更容易将其视为

j = (1 + j);
if (j >= key.length()) {
    j = 0;
}
于 2013-05-16T21:02:20.170 回答