塞瑟的密码

时间:2016-10-19 04:01:16

标签: java algorithm encryption caesar-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)&#39; a&#39;

4 个答案:

答案 0 :(得分:3)

为了让%26正确旋转编码字符,当移位将其推到'z'以外时,您需要处理值0-25。 'a' - 'z'的ASCII值为97-122,使旋转变得困难。通过从被移位的字符中减去“a”,您将字符映射到0-25的值,使用%26进行旋转。

答案 1 :(得分:1)

其ASCII值..字母a的ascii值为97,A的ascii值为65.

我希望您了解ceaser密码的工作原理。

如果您将ABCD作为原始文本并且您希望将1移位以应用ceaser cipher,则表示A将为B,B将为C,C将为D,D将为E.

长度是您的字符串长度,text是您的原始文本,shift是您希望应用ceaser cipher的字母数量的变化。

让我们拿一个示例文本:abcd

换班1

现在让我们假设c值是&#39; a&#39;

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

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

(1%26)+97
1+97 
98

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

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

希望它有意义

答案 2 :(得分:1)

as&#34; Max Hampton&#34;说,ASCII table中字母的值从97开始(在小写字母的情况下)。

因此,例如,如果你有字母c='p',那么c = 112.也&#39; a&#39; = 97,所以&#39; p&#39; - &#39; a&# 39; = 112-97 = 15(注意:p是字母表中的第16位)。

现在我们添加了班次(虽然p现在向前移动一步,我们将在稍后修复它)。让班次为3(我们想要p-> s)

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

现在为修复:18 +&#39; a&#39; = 18 + 97 = 115 =&#39; s&#39; (1回到这里)

并完成:)

答案 3 :(得分:0)

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