凯撒的密码

Ceaser's Cipher

这是 Ceaser 密码的 Java 代码

import java.util.*;

public class Main {

public static void main(String[] args) {
    Scanner stdin = new Scanner(System.in);
    int length = stdin.nextInt();
    String text = stdin.next();
    int shift = stdin.nextInt();

    for(int i = 0; i < length; i++) {
        char c = text.charAt(i);
        if(c >= 'a' && c <= 'z') {
            System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a'));
        } else if(c >= 'A' && c <= 'Z') {
            System.out.print((char)(((int)c - (int)'A' + shift) % 26 + (int)'A'));
        } else {
            System.out.print(c);
        }
    }
    stdin.close();
}
}

我不明白这行代码发生了什么

System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a'));

为什么 -( int ) ' a '

为了使 % 26 在移位将编码字符推到 'z' 之外时正确旋转编码字符,您需要处理值 0-25。 'a' - 'z' 的 ASCII 值是 97-122,使得旋转变得困难。通过从被移动的字符中减去 'a',您将字符映射到 0-25 之间的值,从而可以使用 %26.

进行旋转

它的 ASCII 值。字母 a 的 ascii 值为 97,A 的 ascii 值为 65。

我希望你了解塞塞密码的工作原理。

如果你的原文是ABCD,你想做1的移位来应用ceaser密码,这意味着A将是B,B将是C,C将是D,D将是E。

length 是您的字符串长度,text 是您的原始文本,shift 是您要应用 ceaser 密码的字母表的移位次数。

让我们来看一个示例文本:abcd

第 1 班

现在假设 c 值为 'a'

所以这个语句是(int)c - (int)'a' + shift) % 26 + (int)'a')

通常会做 (97-97+1)%26+97

(1%26)+97
1+97 
98

这是 b 的 ascii 等价物。这就是为什么在你的代码中整个操作在最后转换为 char:

**(char)**(((int)c - (int)'a' + shift) % 26 + (int)'a')

希望它有意义

如"Max Hampton"所说,ASCII table中字母的取值从97开始(小写字母)。

因此,例如,如果您有字母 c='p',则 c = 112。还有 'a'=97,因此 'p'-'a' = 112-97 = 15(注意:p 是字母表中的第 16 位)。

现在我们添加移位(虽然 p 现在向后移动了 1 步,但我们稍后会修复它)。让移位为 3(我们想要 p->s)

现在我们得到 15+3 = 18。18%26 = 18。

现在进行修复:18 + 'a' = 18+97 = 115 = 's'(1 又回来了)

完成:)

#include<iostream>
#include<string>
using namespace std;
int Ceasers_Cipher()
{
    int y;
    string x;
    int r;
    cout << "enter any sentence" << endl;
    getline(cin, x);
    y = x.size();
    cout << "enter rotation" << endl;
    cin >> r;
    for (int i = 0; i < y; i++)
    {
        if (x[i] >= 'a' && x[i] <= 'a'+(26-r))
        {
            x[i] += r;
        }
        else if (x[i] >= 'a' + (26 - r)+1 && x[i] <= 'z')
        {
            x[i] -= 26-r;
        }
        else if (x[i] >= 'A' && x[i] <= 'A' + (26 - r))
        {
            x[i] +=r;
        }
        else if (x[i]>='A' + (26 - r) + 1 && x[i] <= 'Z')
        {
            x[i] -= 26-r;
        }
    }
    cout << x << endl;
    return 0;
}
int main()
{
    Ceasers_Cipher();
}