C ++ caesar密码 - 理解ascii密钥

时间:2014-01-05 03:12:22

标签: c++

我目前正在做一个caesar密码程序。它应该加密大小写。

e.g 如果我输入a,它会将键移动3,最终输出将变为d。

看看我的代码

char c;
c = (((97-52)+3) % 26) + 52;
cout << c;

字母'a'的ASCII码为97。

所以正确

1) ((97-52)+3) will give you 48

2) 48 % 26 will give you 8 since 48/26 will give you a remainder of 8.

3) 8 + 52 = 60(which will by right give you a value of '>' according to the ascii table)

但是我得到的输出是J,我不明白我从哪个输出'J'而不是'&gt;'

我的概念可能有误,所以我需要帮助。

1 个答案:

答案 0 :(得分:0)

让我链接我先使用的ASCII图表:http://pl.wikipedia.org/wiki/ASCII 该网站很精致,但桌子本身是英文的。

我认为很明显问题是你使用的等式:

(((letter-52)+3) % 26) + 52;

实际上,ASCII中的第一个字母为65 (十六进制0x41 - 按照提供的图表进行操作)。 如果在ASCII中的字母块之间没有字符,那么使用模数的想法就可以了。但有(再次检查图表)。

这就是为什么你应该手动检查标志:

  1. 是大写字母:if (letter >= 0x41 && letter <= 0x5a)
  2. 是非资本:if (letter >= 0x61 && letter <= 0x7a)
  3. 通常在制作Ceasar密码时,您应该遵循这些:

    1. 将大写字母替换为字母表中移动给定数字的大写字母。
    2. 如果该字母超出字母范围,则从字母开头继续迭代(X向右移动5将给出C)。
    3. 其他字符保持不变
    4. 现在让我们实现这个(在代码中我将使用字符的字母值 - 以避免错误):

      #include <iostream>
      #include <cstdlib>
      
      using namespace std;
      
      string Ceasar(string input, int offset)
      {
          string result = "";
      
          for (int i = 0; i < input.length(); ++i)
          {
              // For capital letters
              if (input[i] >= 'A' && input[i] <= 'Z')
              {
                  result += (char) (input[i] - 'A' + offset) % ('Z' - 'A') + 'A';
                  continue;
              }
      
              // For non-capital
              if (input[i] >= 'a' && input[i] <= 'z')
              {
                  result += (char) (input[i] - 'a' + offset) % ('z' - 'a') + 'a';
                  continue;
              }
      
              // For others
              result += input[i];
          }
      
          return result;
      }
      
      int main()
      {
          cout << Ceasar(string("This is EXamPLE teXt!?"), 8).c_str();
          system("PAUSE");
      }