凯撒移位密码 java
caesar shift cipher java
我正在尝试为 Java 实现一个基本的凯撒移位密码,以将所有字母移位 13。这是我目前的代码。
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";
returns "nop>?@"
有没有一种简单的方法可以避免特殊字符而只关注字母?
编辑:我应该提到我想保留所有其他位。所以 "abc123" 会 return "nop123".
问题是您将 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());
在下面的示例中,我只加密了字母(更准确地说是 A-Z 和 a-z)并添加了使用任何偏移量的可能性:
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"
注意:根据您的代码,我假设您只想 handle/encrypt "ordinary" 26 个字母。这意味着字母,例如德语“ü”(Character.isLetter('ü')
将 return 为真)保持未加密状态。
我正在尝试为 Java 实现一个基本的凯撒移位密码,以将所有字母移位 13。这是我目前的代码。
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";
returns "nop>?@"
有没有一种简单的方法可以避免特殊字符而只关注字母?
编辑:我应该提到我想保留所有其他位。所以 "abc123" 会 return "nop123".
问题是您将 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());
在下面的示例中,我只加密了字母(更准确地说是 A-Z 和 a-z)并添加了使用任何偏移量的可能性:
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"
注意:根据您的代码,我假设您只想 handle/encrypt "ordinary" 26 个字母。这意味着字母,例如德语“ü”(Character.isLetter('ü')
将 return 为真)保持未加密状态。