如果我想写一个凯撒密码C#我必须通过每个案例?对于我来说,转换为ASCII或UTF是没有意义的(可能是因为我不明白它是如何工作的)。我只需要一个正确的方向。凯撒密码C#
我应该为每个字母分配数字1-26吗?
如果我想写一个凯撒密码C#我必须通过每个案例?对于我来说,转换为ASCII或UTF是没有意义的(可能是因为我不明白它是如何工作的)。我只需要一个正确的方向。凯撒密码C#
我应该为每个字母分配数字1-26吗?
你可以把每个字母到一个数组,并使用数组索引(缠绕在后)或到达最后一个时,你可以简单地使用字母的asccii价值,换到第一位。这里的技巧是,所有的人物都coninuously排序,起始于A = 0×41
对于一个传统的凯撒塞浦路斯,你会检查一个字符在[a-z]或[A-Z]范围内,并且只是通过它否则。
另一种方法是以相同的方式处理所有字符,所以不仅a变为b,而且μ变成¶并且在U + 10FFFF(Unicode中最高的编码点)处环绕变为U + 0000(前者是一个非字符,后者是一个空字符,但没有理由为什么一个string
不能让他们传输到另一个地方。
在这两者之间,是作用于UTF-16。 ,你只需在每个char
的值上加1,然后将U + FFFF换成U + 0000即可。输出可能成为一个无效的UTF-16字符串(因为它可能不匹配surrogates,但这不会阻止你从string
中传递出去,然后再次解密。毕竟,现代加密不会导致有效的字符串。
这是我不明白,如果我想解码一个简单的句子,我将其转换为代码,我可以限制的范围内,这样,当我想“Z”,以比如'b',我是否总是必须来回走动,我能不能把它变成类似于一个车轮?并感谢您的答案。 –
这是规范,而不是工作的事(可悲的是,大多数现实生活中的并发症都是这样过,编程比上班什么客户真正想要更容易)。我会说第一个*可能*是什么意图。 你是什么意思“没有类似于车轮”的意思,撒暗号的任何变种类似于车轮。 –
我的意思是包装 - 正如我从另一个答案=)中发现的那样 - 我应该写下_不能让它变成类似的。我仍然习惯这些条款。 –
或许给出提示将是有益的 - 你说你不想复制或被告知的答案:
char[] chars = new char[]{'a', 'b',...};
也是一个很好的帮助,谢谢! –
这是我的做法。
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
谢谢!这对我有意义,我没有意识到我可以做到这一点(我是一个完整的初学者!)。 –