2015-02-06 151 views
0

我想实现一个Java的基本凯撒移位密码,将所有字母移到13位。下面是我的代码到目前为止。凯撒移位密码java

public static String cipher(String sentence){ 
    String s = ""; 
    for(int i = 0; i < sentence.length(); i++){ 
     char c = (char)(sentence.charAt(i) + 13); 
     if (c > 'z') 
      s += (char)(sentence.charAt(i) - 13); 
     else 
      s += (char)(sentence.charAt(i) + 13); 
    } 
    return s; 
} 

但是,该程序也改变了数字和特殊字符的值,我不希望这样。

String sentence = "abc123"; 

回报“NOP>?@”

有一个简单的方法来避免特殊字符和只专注于信吗?

编辑:我应该提到我想保留所有其他位。所以“abc123”会返回“nop123”。

回答

1

在下面的例子中,我只加密信件(更精确地AZ和az)和添加的可能性使用任何偏移:

public static String cipher(String sentence, int offset) { 
    String s = ""; 
    for(int i = 0; i < sentence.length(); i++) { 
    char c = (char)(sentence.charAt(i)); 
    if (c >= 'A' && c <= 'Z') {  
     s += (char)((c - 'A' + offset) % 26 + 'A'); 
    } else if (c >= 'a' && c <= 'z') { 
     s += (char)((c - 'a' + offset) % 26 + 'a'); 
    } else { 
     s += c; 
    } 
    } 
    return s; 
} 

这里是一些示例:

cipher("abcABCxyzXYZ123", 1) // output: "bcdBCDyzaYZA123" 
cipher("abcABCxyzXYZ123", 2) // output: "cdeCDEzabZAB123" 
cipher("abcABCxyzXYZ123", 13) // output: "nopNOPklmKLM123" 

注意:由于您的代码,我认为您只是想处理/加密“普通”26个字母。这意味着像例如字母德国'ü'(Character.isLetter('ü')将返回true)保持未加密。

0

问题是,您将13添加为固定数字,并且对于某些字母(大部分字母和数字的后半部分)会生成不是字母的字符。

你可以通过使用字母数组并通过这些字符来解决这个问题。 (对位相似)因此,像这样

List<Character> chars = ... // list all characters, separate lists for upper/lower case 
char c = chars.get((chars.indexOf(sentence.charAt(i)) + 13)%chars.size());