Шифр Цезаря на C#
Если я хочу написать шифр Цезаря C# , должен ли я пройти через каждый случай? Для меня нет смысла конвертировать в ASCII или UTF (вероятно, потому, что я не понимаю, как это будет работать). Мне просто нужна точка в правильном направлении.
Должен ли я присвоить каждой букве числа 1-26?
4 ответов:
Вы можете поместить каждую букву в массив и использовать индекс массива (обертывание в конце) или вы можете просто использовать значение asccii буквы и обертывать до первого, когда достигнете последнего. Фокус здесь в том, что все символы конически отсортированы, начиная с A=0x41
Возможно, намеки будут полезны - вы говорите, что не хотите копировать или получать ответ:
Рассмотрим, что C# имеет оператор модуля в виде a = b % c-то есть остаток от b, разделенный на c. Когда c = n и b = n, a = 0. Когда c = n и b = n+1, a = 1. Поэкспериментируйте с поведением этого оператора.
- массивы можно объявлять статически в C# с помощью инициализаторов:
char[] chars = new char[]{'a', 'b',...};
Для традиционного шифра Цезаря вы бы проверили, что символ находится в диапазоне [a-z] или [A-Z], и просто передали бы его в противном случае.
Альтернативой является обращение со всеми символами одинаково, так что не только a становится b, но и µ становится ¶ , и вы оборачиваетесь вокруг U+10FFFF (самая высокая кодовая точка в Unicode) становится U+0000 (первый не является символом, а второй-нулевым символом, но нет никаких причин, почему a
stringне может удерживать их для передачи в другое место.Между ними во-вторых, это действовать на UTF-16. То есть вы просто добавляете 1 к значению каждого
charи переносите U+FFFF через U+0000. Вывод может стать недопустимой строкой UTF-16 (потому что она может иметь неправильно подобранные суррогаты, но это не помешает вам передать ее вstring, а затем расшифровать ее снова. В конце концов, современное шифрование также не приводит к допустимым строкам.
Это мой подход.
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.
Работает только для прописных букв.
Прочитайте статью Википедии: шифр Цезаря
Comments