Цезарь Шифр ​​в C # - PullRequest
       2

Цезарь Шифр ​​в C #

5 голосов
/ 14 декабря 2011

Если я хочу написать шифр Цезаря C #, должен ли я проходить каждый случай? Мне не имеет смысла конвертировать в ASCII или UTF (возможно, потому что я не понимаю, как это будет работать). Мне просто нужна точка в правильном направлении.

Должен ли я присваивать каждой букве цифры 1-26?

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Вы можете поместить каждую букву в массив и использовать индекс массива (обтекание в конце), или вы можете просто использовать значение буквы asccii и переносить до первой при достижении последней.Хитрость в том, что все символы отсортированы непрерывно, начиная с A = 0x41

2 голосов
/ 14 декабря 2011

Возможно, было бы полезно пропустить подсказки - вы говорите, что не хотите копировать или вам говорят ответ:

  • Предположим, что в 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',...};
1 голос
/ 06 марта 2014

Это мой подход.

    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));
    }

приписка

Работает только для заглавных букв.

Прочитайте статью в Википедии: Цезарь

1 голос
/ 14 декабря 2011

Для традиционного Цезаря Сайфера вы бы проверили, что символ находится в диапазоне [az] или [AZ], и просто передали бы его в противном случае.

Альтернативой является обработка всех символов в одном и том жеКстати, не только a становится b, но µ становится ¶, и вы переходите на U + 10FFFF (самая высокая кодовая точка в Unicode) становится U + 0000 (первый - не символ, а второй - нулевой символ, но естьнет причины, по которой string не может удерживать их для передачи в другое место.

Между этими двумя действиями нужно действовать по UTF-16. То есть вы просто добавляете 1 к значению каждогоchar, и оберните U + FFFF до U + 0000. Вывод может стать недопустимой строкой UTF-16 (потому что она может иметь несоответствующие суррогаты , но это не помешает вам пройтиэто примерно в string, а затем снова расшифровывает его. В конце концов, современное шифрование также не приводит к действительным строкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...