解释代码在做什么

时间:2013-05-16 20:33:49

标签: java encryption

有人可能会告诉我这些特定的行正在做什么结果=结果行和后面的那一行,我需要解释这两行。不明白它。从互联网上得到它。

这是完整的代码

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

1 个答案:

答案 0 :(得分:3)

让我们逐行说明:

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

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

(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'

因此,第一行是将下一个纯文本字符(在索引i)添加到下一个关键字符(索引j),如果明文多于关键字,则循环)。它减去130(我不知道为什么 - 也许确保它在标准的ASCII码页面上?),然后模26并增加65以确保它将从A-Z输出一个字符,仅限上限。此结果将附加到之前的结果中。

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

j = (1 + j);
if (j >= key.length()) {
    j = 0;
}