Java 中的字母数字凯撒密码
Alphanumeric Caesar's Cipher in Java
我正在尝试破解 Java 中的凯撒密码,但其中有一个转折点。输入字符串包含字母数字值,我无法解决。以下是我到目前为止所做的尝试:
String rotationalCipher(String input, int rotationFactor) {
// Write your code here
StringBuilder sb = new StringBuilder();
for(int i = 0; i < input.length(); i++) {
if(Character.isLowerCase(input.charAt(i))) {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 97) % 26 + 97);
} else if (Character.isUpperCase(input.charAt(i))) {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 65) % 26 + 65);
sb.append(ch);
} else {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 48) % 10 + 48);
sb.append(ch);
}
}
return sb.toString();
}
我想做的是使用其 ASCII 值评估每个案例,但我似乎没有获得所需的输出。我使用的 ASCII 错了吗?感谢您的帮助!
Sample input/output:
input = Zebra-493?
rotationFactor = 3
output = Cheud-726?
你有两个主要问题。
- 您没有使用小写转换的
append
更新 StringBuilder
。
- 您需要像大写和小写一样使用
isDigit
专门处理数字,这样您就可以忽略诸如 - 和 ? 之类的字符
一些建议。
- 只需要在第一次进入循环时赋值
ch
,然后在整个循环中使用它。无需继续输入所有输入内容。
- 当您退出
if/else
块时,仅将 ch
附加到 StringBuilder 中。
- 使用 'a' 和 'A' 而不是 97 和 65 这样的数字。这样不太可能犯错误。
完成这些更改后,您的代码就可以正常工作了。
下面的代码适合我-
String rotationalCipher(String input, int rotationFactor) {
// Write your code here
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
char x = input.charAt(i);
if (Character.isLowerCase(x)) {
char ch = (char) ((x + rotationFactor - 97) % 26 + 97);
sb.append(ch);
} else if (Character.isUpperCase(x)) {
char ch = (char) ((x + rotationFactor - 65) % 26 + 65);
sb.append(ch);
} else if (Character.isDigit(x)) {
char ch = (char) ((x + rotationFactor - 48) % 10 + 48);
sb.append(ch);
} else {
sb.append(x);
}
}
return sb.toString();
}
String rotationalCipher(String input, int rotationFactor) {
String output = "";
for(char a: input.toCharArray()){
if(Character.isAlphabetic(a)){
char startLetter = Character.isUpperCase(a) ? 'A' : 'a';
output += (char) ((a- startLetter + rotationFactor) % 26 + startLetter);
}
else if(Character.isDigit(a)){
output += (char) ((a + rotationFactor - 48) % 10 + 48);
}
else{
output += a;
}
}
return output;}
我正在尝试破解 Java 中的凯撒密码,但其中有一个转折点。输入字符串包含字母数字值,我无法解决。以下是我到目前为止所做的尝试:
String rotationalCipher(String input, int rotationFactor) {
// Write your code here
StringBuilder sb = new StringBuilder();
for(int i = 0; i < input.length(); i++) {
if(Character.isLowerCase(input.charAt(i))) {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 97) % 26 + 97);
} else if (Character.isUpperCase(input.charAt(i))) {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 65) % 26 + 65);
sb.append(ch);
} else {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 48) % 10 + 48);
sb.append(ch);
}
}
return sb.toString();
}
我想做的是使用其 ASCII 值评估每个案例,但我似乎没有获得所需的输出。我使用的 ASCII 错了吗?感谢您的帮助!
Sample input/output:
input = Zebra-493?
rotationFactor = 3
output = Cheud-726?
你有两个主要问题。
- 您没有使用小写转换的
append
更新StringBuilder
。 - 您需要像大写和小写一样使用
isDigit
专门处理数字,这样您就可以忽略诸如 - 和 ? 之类的字符
一些建议。
- 只需要在第一次进入循环时赋值
ch
,然后在整个循环中使用它。无需继续输入所有输入内容。 - 当您退出
if/else
块时,仅将ch
附加到 StringBuilder 中。 - 使用 'a' 和 'A' 而不是 97 和 65 这样的数字。这样不太可能犯错误。
完成这些更改后,您的代码就可以正常工作了。
下面的代码适合我-
String rotationalCipher(String input, int rotationFactor) {
// Write your code here
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
char x = input.charAt(i);
if (Character.isLowerCase(x)) {
char ch = (char) ((x + rotationFactor - 97) % 26 + 97);
sb.append(ch);
} else if (Character.isUpperCase(x)) {
char ch = (char) ((x + rotationFactor - 65) % 26 + 65);
sb.append(ch);
} else if (Character.isDigit(x)) {
char ch = (char) ((x + rotationFactor - 48) % 10 + 48);
sb.append(ch);
} else {
sb.append(x);
}
}
return sb.toString();
}
String rotationalCipher(String input, int rotationFactor) {
String output = "";
for(char a: input.toCharArray()){
if(Character.isAlphabetic(a)){
char startLetter = Character.isUpperCase(a) ? 'A' : 'a';
output += (char) ((a- startLetter + rotationFactor) % 26 + startLetter);
}
else if(Character.isDigit(a)){
output += (char) ((a + rotationFactor - 48) % 10 + 48);
}
else{
output += a;
}
}
return output;}