如果我想写一个Caesar密码C#,我必须经历每一个案例吗?转换为ASCII或UTF对我来说没有意义(可能是因为我不明白它是如何工作的)。我只需要一个正确的方向点。
我应该为每个字母分配数字1-26吗?
答案 0 :(得分:2)
您可以将每个字母放入一个数组并使用数组索引(在末尾包装),或者您可以简单地使用字母的asccii值并在到达最后一个时将其换行到第一个。这里的诀窍是所有字符都是连续排序的,从A = 0x41
开始答案 1 :(得分:2)
也许删除提示会有所帮助 - 你说你不想复制或被告知答案:
char[] chars = new char[]{'a', 'b',...};
答案 2 :(得分:1)
对于传统的凯撒Cypher,你要检查一个字符在[a-z]或[A-Z]范围内,否则只是通过它。
另一种方法是以相同的方式处理所有字符,因此不仅a变为b,而且μ变为¶并且你在U + 10FFFF(Unicode中的最高代码点)环绕变为U + 0000(前者是非字符,后者是空字符,但没有理由string
无法将它们传送到另一个地方。
在这两者之间,是对UTF-16采取行动。也就是说,您只需将1添加到每个char
的值,并将U + FFFF包装到U + 0000。输出可能会成为无效的UTF-16字符串(因为它可能与surrogates不匹配,但这不会阻止您在string
中传递它,然后再次对其进行解密。所有,现代加密也不会产生有效的字符串。
答案 3 :(得分:1)
这是我的方法。
public static string Encrypt(string str, int n)
{
return string.Join("", str.Select(x => Encrypt(x, n)));
}
public static string Decrypt(string str, int n)
{
return string.Join("", str.Select(x => Decrypt(x, n)));
}
public static char Encrypt(char chr, int n)
{
int x = chr - 65;
return (char)((65) + ((x + n) % 26));
}
public static char Decrypt(char chr, int n)
{
int x = chr - 65;
return (char)((65) + ((x - n) % 26));
}
P.S。
仅适用于大写字母。
阅读维基百科文章:Caesar cipher