我正在使用一个简单的密码,将字母表中的每个字母切换到相应的三个空格。我首先使用一种方法来加密密码,现在我正在解密它。不幸的是,除了abc
之外,每个字母都有效,它返回一个撇号,一个连字符和一个空格。如何使循环跳过ASCII中的符号并设法使其从A循环回Z?
public static String caesarDecrypt(String encoded, int shift){
String decrypted = "";
for (int i = 0; i < encoded.length(); i++) {
char t = encoded.charAt(i);
if ((t >= 'a') && (t <= 'z')) {
t -= shift;
}
if (t > 'z') {
t += 26;
} else if ((t >= 'A') && (t <= 'Z')) {
{
t -= shift;
}
if (t > 'Z')
t += 26;
} else {
}
decrypted = decrypted + t;
}
return decrypted;
}
答案 0 :(得分:3)
Java char
基于ASCII / UTF值,如下所示:
a = 97
A = 65
(搜索ASCII表等进行验证)
基于此,这部分代码:
if ((t >= 'a') && (t <= 'z')) {
t -= shift;
}
总是根据编码将字符“向下”移位。请注意:
char(a) - 1 = `
这不完全是撇号,但我可以看出你为什么这么说。
对于这些字符,您的其余代码无法访问(或者在空else
块的情况下几乎没有任何内容),因此您的密码无法正确“移动”第一组小写字符字母表。
提示:这不是你的密码中唯一的逻辑缺陷......你应该更仔细地审查你如何处理大写字母。
为了提供帮助,您应该在转换之前打印出字符整数值的日志,然后打印出......
编辑:
工作密码适当考虑移位运算符。它甚至可能大于26 ...因此,您对小写字母的if
语句应如下所示:
if ((t >= 'a') && (t <= 'z')) {
t = (t - 'a' + shift)%26 + 'a';
}
和递减应该使用负移位值...或传递给方法的布尔值来处理。