Преобразование значений ASCII в Char - PullRequest
1 голос
/ 24 сентября 2010
String source = "WEDGEZ"
char letter = source.charAt(i);
shift=5;
for (int i=0;i<source.length();i++){
if (source.charAt(i) >=65 && source.charAt(i) <=90 )
  letterMix =(char)(('D' + (letter - 'D' + shift) % 26));
}

Хорошо, что я пытаюсь сделать, это взять строку WEDGEZ и сдвинуть каждую букву на 5, чтобы W стало B, а E стало J, и т. Д. Однако я чувствую, что есть некоторое несоответствие с числами, которые япользуюсь.

Для оператора if я использую значения ASCII, а для letterMix= statement я использую числа от 1-26 (я думаю).Ну, на самом деле, вопрос тоже об этом:

Что все равно возвращает (char)(('D' + (letter - 'D' + shift) % 26));?Возвращает право char, но конвертируется из int.Я нашел это заявление в Интернете где-то, но сам не составил его, так что именно возвращает это утверждение.

Общая проблема с этим кодом состоит в том, что для W он возвращает '/', а для Z он возвращает _,что я предполагаю, означает, что он использует значения ASCII.Я действительно не знаю, как подойти к этому.

Редактировать: Новый код

    for (int i=0;i<source.length();i++)
        {
        char letter = source.charAt(i);
        letterMix=source.charAt(i);
        if (source.charAt(i) >=65 && source.charAt(i) <=90 ){
            letterMix=(char)('A' + (  ( (letter - 'A') + input ) % 26));
            }
        }

Ответы [ 2 ]

4 голосов
/ 24 сентября 2010

Ну, я не уверен, если это домашнее задание, поэтому я буду скуп с Кодексом.

Вы пишете Цезарь со сдвигом 5.

Для решения вашей проблемы Z -> _ ... Я предполагаю, что вы хотите, чтобы все буквы были заменены на закодированные (а не странные символы).Проблема в том, что значения ASCII A-Z лежат между 65 и 90. При кодировании Z (например,) вы добавляете к нему 5, что дает вам значение 95 (_).

Что вам нужно сделать, это обернуть вокруг доступных алфавитов.Сначала выделите, относительную позицию символа в алфавите (то есть A = 0, B = 1 ...). Вы должны вычесть 65 (то есть ASCII из A. Добавьте свой Shift, а затем примените modulus 26Это заставит ваше значение обернуться вокруг.

Например, это ваша кодировка Z, (ASCII = 90), поэтому относительная позиция равна 25 (= 90 - 65). Теперь 25 + 5 = 30, но вам нужно, чтобы значение было в пределах 26. поэтому вы берете modulus 26, поэтому 30 % 26 равно 4, что составляет E.

Итак, вот оно

char letter = message(i);
int relativePosition = letter - 'A'; // 0-25
int encode = (relativePosition + shift) % 26
char encodedChar = encode + 'A' // convert it back to ASCII.

Таким образом, в одной строке,

char encodedChar = 'A' + (  ( (letter - 'A') + shift ) % 26)

Обратите внимание, это будет работать только в верхнем регистре, если вы планируете использовать нижний регистр, вам потребуется дополнительная обработка.

Вы можете использовать Character.isUpperCase() для проверки заглавных букв.

0 голосов
/ 12 июля 2018

класс Ascii {

публичная статическая пустота

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