Создание Ceasar Cipher на Java

В настоящее время я работаю над проектом, в котором я должен создать Ceaser Cipher, взяв файл в качестве входных данных, а затем запрашивая число у пользователя. Число должно использоваться для сдвига букв вперед, поэтому, если введенное число было 2, a станет c. Алфавит должен обернуться вокруг (поэтому, если буква z, а ввод 2, зашифрованная буква b), и программа должна игнорировать небуквенные символы и просто продолжать идти дальше.

У меня есть решение, которое, как я полагаю, должно сработать, но я думаю, что мне чего-то не хватает, так как результат - это НЕ то, что я ожидал, и что это должно быть Я включил соответствующий раздел кода ниже

public static String encode(String content, int num){
    char[] contentArray = content.toCharArray();
    String encoded = "";
    for(int i = 0; i < contentArray.length; i++){
        char current = contentArray[i];
        if (current >= 'a' && current <='z' || current >= 'A' && current <= 'Z'){
            current = (char) (current + num);
            if (current > 'z' | current > 'Z'){
                current = (char) (current - 26);
            } else if (current < 'a' | current < 'A'){
                current = (char) (current + 26);
            }
            contentArray[i] = current;
            encoded = encoded + encoded.concat(Character.toString(contentArray[i]));
        } else {
            i++;
        }
    }
    return encoded;
}

Вверху это моя основная функция, которая просто запрашивает у пользователя необходимый ввод перед вызовом этой функции. В этом случае содержимое строки состоит из следующих символов: taco cat 1-349z 2

Теоретически это должно вернуть vceq ecv 1-349b 2, если пользователь вводит 2 как num. К сожалению, это возвращает следующее...

\ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \\ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \ б

... что явно НЕ правильно. Я понятия не имею, что происходит в моем коде, поэтому любая помощь будет принята с благодарностью. Спасибо!

1 ответ

Решение

Попробуй это

public static String encode(String enc, int offset) {
        offset = offset % 26 + 26;
        StringBuilder encoded = new StringBuilder();
        for (char i : enc.toCharArray()) {
            if (Character.isLetter(i)) {
                if (Character.isUpperCase(i)) {
                    encoded.append((char) ('A' + (i - 'A' + offset) % 26));
                } else {
                    encoded.append((char) ('a' + (i - 'a' + offset) % 26));
                }
            } else {
                encoded.append(i);
            }
        }
        return encoded.toString();
    }

использование

 System.out.println(encode("taco cat 1-349z", 2));
Другие вопросы по тегам