2013-05-16 23 views
-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(); 
+0

打破这些排队,并尝试像这样翻译它。告诉我们你不懂的部分。 – iamnotmaynard

+0

另请注意,'A'== 65' – FDinoff

+1

%是模数 - 仅供参考。请更具体地说 - 这些线路完全按照他们的工作进行。一些数学。 – piotrpo

回答

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) 

现在他们的十进制表示

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

如果这恰好是信范围的另一端更换z S('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; 
}