#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 вернет anint
вместо achar
(так(char) (v 'a')
и должно быть).