2013-03-06 75 views
-3

事实上,如果使用代码[A],运行失败。我不明白为什么。我也不明白,首先 - 'A'然后+'A'。为什么[A]失败? [B]好吗?什么是'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; 
    } 
+0

请更清楚你想问什么。 – 2013-03-06 15:50:38

+1

我们无法知道你为什么不能做某些事情。如果你告诉我们你是如何尝试的,以及当你尝试过时发生了什么,这会有所帮助,所以我们可以帮助你。 – Ingo 2013-03-06 16:03:20

+1

@BheshGurung很简单。他想知道如果使用代码[A]'为什么会失败! – 2013-03-06 19:46:04

回答

1

井[A]形式给出025之间的值,并且[B]的形式给你'A''Z'(含)之间的值。他们显然不是同一个表达。


如果你阅读本光两种形式,在[B]的形式第一次使用的'A'是确保结果值范围为'A'通过'Z'停留。

'A'被扣除的第二个用途是需要正确实施凯撒加密。如果你删除它,你会得到一个不同的加密。 (该- 'A'确保key选择字母的key次旋转没有它,你的encryptCaesar(a, key)将实际计算real_caesar(a, (key - 64) % 26);即撒使用不同的密钥加密)。

但是,这都应该是显而易见的,如果你“的手执行“代码的两个版本,以了解它们如何将输入字符映射为输出字符。

2

如果我理解你的要求......

这里'A'的功能是将一个字符转换成对应于字母表的顺序位置的数字。

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

+0

我不明白,首先 - 'A'然后+'A'。为什么[A]失败? [B]好吗? – user2094097 2013-03-06 16:44:17

+0

如果使用[A],则运行失败。我不理解[B]中的'A'角色。 – user2094097 2013-03-06 16:59:26