返回(char)((((ch + key) - offset)%26)+ offset)代码做什么?

时间:2017-10-29 14:20:49

标签: c# char caesar-cipher

所以我在线查找C#Caesar密码,我找到了这个网站: https://www.programmingalgorithms.com/algorithm/caesar-cipher

我仔细检查过,通常代码对我来说是有意义的,直到这一部分:

char offset = char.IsUpper(ch) ? 'A' : 'a';
return (char)((((ch + key) - offset) % 26) + offset);

我理解三元运算符,它主要是我能理解的第二行,它返回一个字符,但不知何故将一个字符和一个数字加在一起,减去一个字符,得到模数,然后加上一个字符?

我提出的唯一解释是每个角色都有一个ID而且它正在对其进行操作而不是角色本身?  老实说,如果有人可以解释一下那会很棒的话,它有点超出我的范围。

提前致谢。

2 个答案:

答案 0 :(得分:2)

说你按了一个键,说它是F,ascii代码将是0x46 因此

int ch = 0x46;

然后将值移动为关键参数(让我们取3)

int key = 21;

offeset只是数字vaue和ascii代码的偏移量:

'A' - 'A' = 0 -> A is at index 0 of letters
'B' - 'A' = 1 -> B is at index 1 of letters
...
'Z' - 'A' = 25 -> Z is at index 25

使用'a'时字母为小写的情况相同。

现在%26对字母执行了一些循环

因此(('F' + 21) -'A') % 26给出0

然后回到字母范围: 0 +'A'='A'

如你的标题所述,这只是'C'中的凯撒密码

答案 1 :(得分:0)

根据ECMA-334 (C# language spec)

  

char类型用于表示Unicode代码单元。 char类型的变量表示单个16位Unicode代码单元。

根据the unicode.org glossary *

  

代码单位。最小位组合,可以表示用于处理或交换的编码文本单元。 Unicode标准使用UTF-8编码形式的8位代码单元,UTF-16编码形式的16位代码单元和UTF-32编码形式的32位代码单元。

从这两个资源中我们可以推断出char类型是一个16位宽的二进制数字字段。有什么更好的方法来实现16位宽的二进制数字字段而不是16位整数,嗯?