有人可能会告诉我这些特定的行正在做什么结果=结果行和后面的那一行,我需要解释这两行。不明白它。从互联网上得到它。
这是完整的代码
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 :(得分: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;
}