ArrayIndexOutOfBoundsException при шифровании строки с помощью замены

274
28 марта 2018, 05:11

Задача:

Зашифровать произвольный открытый текст над латинским алфавитом с помощью шифра однобуквенной замены

Код:

String str = "BE_HAPPY";
String[] bytes = new String[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " " };
int[] key = new int[] { 18, 22, 11, 7, 15, 19, 1, 23, 20, 26, 3, 14, 25, 4, 9, 5, 2, 24, 21, 6, 0, 8, 13, 12, 16, 10, 17 };
String a = "";
String m = "";
for (String ma : str.split("")) {
    m = m + bytes[key[Arrays.asList(bytes).indexOf(ma)]];
}
System.out.print(m);

Ошибка:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at L5.lab5.main(lab5.java:24)

Что делать?

Answer 1

в массиве bytes нет символа подчеркивания, поэтому Arrays.asList(bytes).indexOf(ma) возвращает -1. После попытки обратиться к -1 элементу массива key выбрасывает java.lang.ArrayIndexOutOfBoundsException: -1

Answer 2

Как уже было сказано, проблема в символе _, для которого нет соответствия в "таблице шифрования".

Позволю себе предположить, что символы, которых нет в "таблице шифрования", должны оставаться в первозданном виде. Тогда, с учетом небольшой оптимизации, код может выглядеть так:

String str = "BE_HAPPY";
Character[] chars = new Character[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ' };
List<Character> charsList = Arrays.asList(chars);
int[] key = new int[] { 18, 22, 11, 7, 15, 19, 1, 23, 20, 26, 3, 14, 25, 4, 9, 5, 2, 24, 21, 6, 0, 8, 13, 12, 16, 10, 17 };
StringBuilder sb = new StringBuilder(str.length());
for (char ch : str.toCharArray())
{
    int charIndex = charsList.indexOf(ch);
    char resultChar = charIndex >= 0 ? chars[key[charIndex]] : ch;
    sb.append(resultChar);
}
System.out.println(sb.toString()); //WP_XSFFQ
READ ALSO
Помогите с шифрованием RSA - JAVA

Помогите с шифрованием RSA - JAVA

Пишу приложение-криптер на java для школьного проекта(можно сказать еще новичок), хочу реализовать алгоритм RSA, чтобы можно было через него...

247
Захват звука с (колонок) аудиовыхода

Захват звука с (колонок) аудиовыхода

Привет всем, нужна помощь с захватом звука с аудио выхода (если это вообще возможно средствами Java) Данный код работает, но захватывает звук...

215
mediaController.setPrevNextListeners

mediaController.setPrevNextListeners

Я хочу активировать следующий и предыдущий элементы управления на контроллере Android Media в приложении AndroidЯ старался, но все равно не добился

210