Jav*_*ner 5 java encryption vigenere
请有人解释下面突出显示的代码行.我根本不明白这条线是如何工作的.
您可以使用此示例来帮助我:
input: ATTACK keyword: LEMON res: LXFOPV
我不明白,行如何帮助编码A,以L和其他信... 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;
}
Run Code Online (Sandbox Code Playgroud)
代码使用字母的ASCII值.字母AZ是ASCII值65-90.
我们的想法是将两个字母加在一起,但如果值超过90(称为模运算),则将其环绕.所以91实际上应该是65(即Z + 1 = A).
Java %为执行模运算(x % n)提供了一个运算符.但是,这适用于0→ n-1的数字范围.因此,如果我们从每个字母中减去65,那么我们将在0→25范围内工作.这允许我们使用模数运算符(x % 26).
这就是代码正在做的事情:
c + key.charAt(j) - 2 * 'A'
Run Code Online (Sandbox Code Playgroud)
这部分将两个字母加在一起,但也从每个字母中减去65.如果写成以下内容可能更容易理解:
(c - 'A') + (key.charAt(j) - 'A')
Run Code Online (Sandbox Code Playgroud)
你会发现你可以做- 'A'一个方便的方式- 65.
现在我们有一个从零开始的值,但可能大于25.所以我们然后对它进行模数化:
(c + key.charAt(j) - 2 * 'A') % 26
Run Code Online (Sandbox Code Playgroud)
然后,我们需要将65添加回值,以将其恢复到ASCII的AZ范围:
(c + key.charAt(j) - 2 * 'A') % 26 + 'A'
Run Code Online (Sandbox Code Playgroud)
唯一剩下的步骤是将其转换为a char,因为int默认情况下结果是:
res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A');
Run Code Online (Sandbox Code Playgroud)
如果输入是ATTACK和关键字是LEMON,那么在某些时候我们将不得不考虑输入字母T(ASCII 84)和关键字母M(ASCII 77).
从每个减去65,我们得到T = 19和M = 12.加在一起,我们得到31.
31 % 26 = 5.所以我们然后计算5+65=70,这是ASCII值 F.
| 归档时间: |
|
| 查看次数: |
690 次 |
| 最近记录: |