Создание 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));