所以我在线查找C#Caesar密码,我找到了这个网站: https://www.programmingalgorithms.com/algorithm/caesar-cipher
我仔细检查过,通常代码对我来说是有意义的,直到这一部分:
char offset = char.IsUpper(ch) ? 'A' : 'a';
return (char)((((ch + key) - offset) % 26) + offset);
我理解三元运算符,它主要是我能理解的第二行,它返回一个字符,但不知何故将一个字符和一个数字加在一起,减去一个字符,得到模数,然后加上一个字符?
我提出的唯一解释是每个角色都有一个ID而且它正在对其进行操作而不是角色本身? 老实说,如果有人可以解释一下那会很棒的话,它有点超出我的范围。
提前致谢。
答案 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位整数,嗯?