Получение символа, который будет представлен int 0-25

#java #encryption #char #int

#java #шифрование #символ #int

Вопрос:

Я работаю над программой криптографии, которая реализует различные традиционные методы. Для некоторых из них лучше всего, чтобы мое сообщение было представлено в виде чисел 0-25. A равно 0, B равно 1 и т.д. Этот шифр сдвига является одним из таких случаев, поскольку вы должны использовать mod 26 для переноса. Также должны быть сохранены пробелы и знаки препинания. Вот код для метода, который выполняет шифрование сдвига:

 public static void shift(char k, char eord)
{
    if(eord=='E' || eord=='e')
    {
        int [] mi= new int[mc.length];
        for(int i=0; i<mc.length; i  )
        {
            if ((mc[i]>='a' amp;amp; mc[i]<='z') || (mc[i]>='A' amp;amp; mc[i]<='Z'))
            {
                mi[i]=(int)(mc[i] k);
                mi[i]=mi[i]%26;
                //mc[i]=(char)mi[i];
                //System.out.println(mi[i]);
            }
        }
    }
}
  

mc — это массив символов, который содержит сообщение, а eord — это символ, который определяет, следует ли запускать алгоритм для шифрования или дешифрования. Что у меня есть в коде, так это проверить, чтобы убедиться, что mc[i] является буквой, а затем добавить символ k (ключ), а затем я набираю приведение его к целому числу, чтобы я мог изменить 26. Что-то работает неправильно, потому что, когда у меня есть ключ ‘b’ (1) и я вижу, что такое целочисленное представление, это определенно неверно. Мне также нужно преобразовать его обратно в символ, когда я закончу, чтобы я мог предоставить пользователю открытый текст / зашифрованный текст сообщения.

Комментарии:

1. символ b имеет значение ASCII 98, поэтому, если вы печатаете b как int, вы получите 98. Если вы хотите, чтобы это было 1, вы должны вычесть из него 97. Это также будет a = 0, c = 2 и т.д. Это то, о чем вы спрашивали?

2. Что такое mc ? Этот код выглядит ужасно запутанным для того, что должно быть довольно простым. Кроме того, 0-25 не позволяет вам представлять пробел или знаки препинания … вероятно, это не то, что вы хотите.

3. @JimGarrison mc — это массив символов, которые содержат сообщение. т.е. если сообщение было «привет», mc [0]= ‘h’, mc [1] = ‘e’ и так далее. Мне также не нужно менять пробелы и знаки препинания, поэтому мне нужны только цифры 0-25. Также, если я использую только значения кода ASCII, методы криптографии не будут работать должным образом. ‘A’ и ‘a’ должны рассматриваться «как одно и то же»

4. @MegumiAi в этом случае вы можете сделать mi[i]2-1 , чтобы превратить A и a в 0 и т.д.

5. Примечание: новая строка уже равна 10 (и, возможно, 13)

Ответ №1:

Чтобы получить целочисленное значение 0 ..25 символа, вам нужно убедиться, что вы получаете только символы верхнего или нижнего регистра в алфавите.

Давайте предположим, что в нижнем регистре. Затем вы можете просто преобразовать символы в целое число, вычитая значение 'a' символа. Поскольку значения символов упорядочены как в обычном алфавите, это даст 'a' значение 0 и 'z' значение 25 … и все буквы между ними также получат правильное значение.

Я покажу версию в нижнем регистре, так как мне не нравится кричать:

 public class CharacterToZeroBasedIntegerRange {

    public static int characterToIntegerRange(char c) {
        if (c < 'a' || c > 'z') {
            throw new IllegalArgumentException(String.format("Character with value X is not a letter", (int) c));
        }

        return c - 'a';
    }

    public static void main(String[] args) {
        String test = "Hello world!".toLowerCase().replaceAll("[^a-z]", "");
        System.out.println(test);
        for (int i = 0; i < test.length(); i  ) {
            char c = test.charAt(i);
            System.out.println(characterToIntegerRange(c));
        }
    }
}
  

Комментарии:

1. А затем, чтобы превратить целое число обратно в символ, у меня была бы функция char, которая имела int для аргумента и добавила ‘a’ к int правильно?

2. Да, измените алгоритм на противоположный, и вы в выигрыше. Однако вам нужно его использовать, поскольку символ int a вернет an int вместо a char (так (char) (v 'a') и должно быть).