如何修复我的方法,使其只返回字母而不是符号?

时间:2015-10-15 00:48:13

标签: java

我正在使用一个简单的密码,将字母表中的每个字母切换到相应的三个空格。我首先使用一种方法来加密密码,现在我正在解密它。不幸的是,除了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;

}

1 个答案:

答案 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';
}

和递减应该使用负移位值...或传递给方法的布尔值来处理。