在 Java 中创建凯撒密码
Creating Ceasar Cipher in Java
我目前正在开展一个项目,在该项目中,我将通过将文件作为输入然后向用户请求数字来创建 Ceaser Cipher。该数字用于将字母向前移动,因此如果输入的数字为 2,则 a 将变为 c。字母表是环绕的(因此如果字母是 z 并且输入是 2,则加密字母将是 b),程序将忽略非字母字符并继续向前。
我有一个我认为应该可行的解决方案,但我认为我遗漏了一些东西,因为输出不是我所期望的,也不应该是。我在下面包含了相关的代码部分
public static String encode(String content, int num){
char[] contentArray = content.toCharArray();
String encoded = "";
for(int i = 0; i < contentArray.length; i++){
char current = contentArray[i];
if (current >= 'a' && current <='z' || current >= 'A' && current <= 'Z'){
current = (char) (current + num);
if (current > 'z' | current > 'Z'){
current = (char) (current - 26);
} else if (current < 'a' | current < 'A'){
current = (char) (current + 26);
}
contentArray[i] = current;
encoded = encoded + encoded.concat(Character.toString(contentArray[i]));
} else {
i++;
}
}
return encoded;
}
上面是我的主要功能,它只是在调用此功能之前询问用户必要的输入。在这种情况下,字符串内容由以下字符组成:taco cat 1-349z 2
理论上,这应该return vceq ecv 1-349b 2,如果用户输入2作为num。不幸的是 return 以下...
\I\IK\I\IKW\I\IK\I\IKWI\I\IK\I\IKW\I\IK\I\IKWI\\I\IK\I\IKW\I\IK\I\IKWI\I\IK\I\IKW\I\IK\I\IKWI\b
...这显然是不正确的。我不知道我的代码出了什么问题,所以非常感谢任何帮助。谢谢!
试试这个
public static String encode(String enc, int offset) {
offset = offset % 26 + 26;
StringBuilder encoded = new StringBuilder();
for (char i : enc.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + offset) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + offset) % 26));
}
} else {
encoded.append(i);
}
}
return encoded.toString();
}
用法
System.out.println(encode("taco cat 1-349z", 2));
我目前正在开展一个项目,在该项目中,我将通过将文件作为输入然后向用户请求数字来创建 Ceaser Cipher。该数字用于将字母向前移动,因此如果输入的数字为 2,则 a 将变为 c。字母表是环绕的(因此如果字母是 z 并且输入是 2,则加密字母将是 b),程序将忽略非字母字符并继续向前。
我有一个我认为应该可行的解决方案,但我认为我遗漏了一些东西,因为输出不是我所期望的,也不应该是。我在下面包含了相关的代码部分
public static String encode(String content, int num){
char[] contentArray = content.toCharArray();
String encoded = "";
for(int i = 0; i < contentArray.length; i++){
char current = contentArray[i];
if (current >= 'a' && current <='z' || current >= 'A' && current <= 'Z'){
current = (char) (current + num);
if (current > 'z' | current > 'Z'){
current = (char) (current - 26);
} else if (current < 'a' | current < 'A'){
current = (char) (current + 26);
}
contentArray[i] = current;
encoded = encoded + encoded.concat(Character.toString(contentArray[i]));
} else {
i++;
}
}
return encoded;
}
上面是我的主要功能,它只是在调用此功能之前询问用户必要的输入。在这种情况下,字符串内容由以下字符组成:taco cat 1-349z 2
理论上,这应该return vceq ecv 1-349b 2,如果用户输入2作为num。不幸的是 return 以下...
\I\IK\I\IKW\I\IK\I\IKWI\I\IK\I\IKW\I\IK\I\IKWI\\I\IK\I\IKW\I\IK\I\IKWI\I\IK\I\IKW\I\IK\I\IKWI\b
...这显然是不正确的。我不知道我的代码出了什么问题,所以非常感谢任何帮助。谢谢!
试试这个
public static String encode(String enc, int offset) {
offset = offset % 26 + 26;
StringBuilder encoded = new StringBuilder();
for (char i : enc.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + offset) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + offset) % 26));
}
} else {
encoded.append(i);
}
}
return encoded.toString();
}
用法
System.out.println(encode("taco cat 1-349z", 2));