-4

事实上,如果使用代码[A],运行会失败。我不明白为什么。我也不明白先 -'A' 然后 +'A'。为什么 [A] 失败了?[乙]好吗?

Code [A]  (char) (ch + key) % 26 )
Code [B]  (char) ('A' + ((ch -'A' + key) % 26))

public void run() {

        setFont("Arial-PLAIN-24");
        String line = readLine ("Enter line: ");
        int key = readInt ("Enter key: ");

        String siphertext = encryptCaesar(line , key);

        println("The result is: " + siphertext);

        String newplain = encryptCaesar(siphertext , -key);
        println("newplain:" + newplain);

    }

    private String encryptCaesar(String str , int key){
        if(key < 0){
            key = 26 - ( -key % 26 );
        }

        String result = "";
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);        
            result += encryptChar(ch,key);
        }
        return result;
    }
    /**Why can't use ( (ch + key) % 26 )*/

    private char encryptChar(char ch, int key){
        if(Character.isUpperCase(ch)){
            return ( (char) ('A' + ((ch -'A' + key) % 26)) );
        }
        return ch;
    }
4

2 回答 2

2

如果我明白你在问什么...

这里的功能'A'是将一个字符转换为一个数字,该数字对应于它在字母表中的顺序位置。

该表达式(ch -'A' + key) % 26将根据字符的顺序位置和键变量的值产生一个 0 到 25 范围内的值。

于 2013-03-06T15:55:37.380 回答
1

那么 [A] 形式给出的值介于0和之间25,而 [B] 形式给出的值介于'A'和之间'Z'。它们显然不是同一种表达方式。


如果您从这个角度阅读这两种形式,'A'[B] 形式中的第一个用途是确保结果值保持'A''Z'.

减去的第二个用途'A'是需要正确实现凯撒加密。如果你删除它,你最终会得到不同的加密。(- 'A'确保key选择key字母表的第 th 轮换。没有它,您encryptCaesar(a, key)将实际计算real_caesar(a, (key - 64) % 26);即使用不同密钥的凯撒加密。)

但是,如果您“手动执行”两个版本的代码以查看它们如何将输入字符映射到输出字符,这一切都应该是显而易见的。

于 2013-03-06T15:52:47.353 回答