我真的失去了头发。我正在制作(简单)加密程序。 它应该将char设为int,添加13并转换回char。然后它应该以相反的顺序做同样的事情。但我唯一的外印是两个空行?我知道问题是当我转换回字母时,我打印x一切正常。我已经评论过的部分是我尝试过的,当我得到一个输出结束时,它比原始文本更新。我也必须在模块26中这样做。
String str = ("helloworld");
String end ="";
String endtwo ="";
for(int i = 0; i < str.length(); i++){
int x = str.charAt(i);
x = ((char)((x+13)%26));
char u =(char)x;
end += u;
//end += ((char)(str.charAt(i)+13));
}
for(int i = 0; i < str.length(); i++){
int x = str.charAt(i);
x = ((char)((x-13)%26));
char u =(char)x;
endtwo += u;
//endtwo += ((char)(str.charAt(i)-13));
}
答案 0 :(得分:0)
在Java中,char是一个整数。请注意该行
int x = str.charAt(i);
返回一个整数,表示String中第i个位置的字符。那么整数的值是多少?您可以在ASCII table中查找字母表中的字母。你会看到小写的h是十进制的104。所以你再添加13到这个值
104 + 13 = 117
然后继续使用26进行修改,将值减小到0到25之间。
117 % 26 = 13
ASCII表中的十进制13表示回车符。
类似地,换句话说你从13开始,减去13给0然后0 mod 26是0所以0是ASCII表中的空字符。
因此,请重新考虑加密算法的策略。例如,要获得一个简单的循环密码,您可以减去小写字符&#39; a&#39;来自要编码的角色。
x = x - 'a';
x = x + 13;
x = x % 26;
x = x + 'a';
这可以保证您最终得到一个字母。但只是小写但是。你如何修改它以迎合大写?
还要仔细考虑最后的解密步骤。减去13并不一定能给出你期望的答案。提示:尝试通过与加密完全相同的过程运行密文,看看会发生什么。
答案 1 :(得分:0)
实现ROT13加密算法的一个非常简单的方法是检查每个字符的ASCCI代码范围,然后根据范围添加13或子13:
String str = "helloworld";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c >= 'A' && c < 'N' || c >= 'a' && c < 'n') {
c += 13;
} else if (c >= 'N' && c <= 'Z' || c >= 'n' && c <= 'z') {
c -= 13;
}
}