2013-03-07 49 views
0

问题一:下面是两个代码微调器。代码A运行错误。但我不知道什么是错的。有关字符串加密调度的错误:(char)(ch + key)%26

问题二:代码B是对的,但我不明白为什么需要删除'A'。然后在fmod后添加'A'。 'A'有什么影响?为什么删除后有错误?

代码A(CH +键)%26)

代码B( 'A' +((CH -'A” +键)%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; 
    } 

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

你是什么意思,该代码“跑错了”?请发布一个完整的示例,重现问题并准确描述问题所在。 – 2013-03-07 02:18:25

回答

0

'A'被添加以确保“encryptChar”方法的结果,是ASCII范围64 to 90,这是A (CAPITAL) to Z (CAPITAL)有效字符。请参阅ASCII表here

在你的代码中减去'A'也可以忽略。这是下面也将工作,

('A' + ((ch + key) % 26)) 
+0

Ofcourse由于溢出,此src不适用于(Integer.MIN_VALUE + 89)和(Integer.MIN_VALUE -64)之间的键值。但这与OP的查询无关。 – Jayamohan 2013-03-07 08:09:59

0

15.7 0.3余操作符%

... 从这个规则,求余运算 的结果可能是负只有当股息为负如下,可以是正数 只有股息为正数。

一个例子则提供:

int e = (-5)%3; // -2 
int f = (-5)/3; // -1 
System.out.println("(-5)%3 produces " + e + 
        " (note that (-5)/3 produces " + f + ")"); 

如果((ch -'A' + key) % 26))结果是否定的,那么就不会的(char) ('A' + ((ch -'A' + key) % 26))结果是一些非字母字符?也许你需要添加26到任何负值或找到绝对值,以便它们是积极的,并产生实际的字母字符。