理解Java中的Caesar密码
所以我需要一点帮助来理解这段代码是如何工作的。我从互联网上获得了这段代码,但我不能清楚地理解它,尽管我完全理解凯撒密码是如何工作的。不幸的是,它的代码版本对我来说有点神秘。如果有人能告诉我这段代码的作用,那将非常有帮助理解Java中的Caesar密码,java,Java,所以我需要一点帮助来理解这段代码是如何工作的。我从互联网上获得了这段代码,但我不能清楚地理解它,尽管我完全理解凯撒密码是如何工作的。不幸的是,它的代码版本对我来说有点神秘。如果有人能告诉我这段代码的作用,那将非常有帮助 public class CaesarCipherProgram{ public static void main(String[] args) { String str = "This is a secret"; System.out.println( Ca
public class CaesarCipherProgram{
public static void main(String[] args) {
String str = "This is a secret";
System.out.println( CaesarCipherProgram.encode( str, 3 ));
System.out.println( CaesarCipherProgram.decode( CaesarCipherProgram.encode( str, 3), 3));
}
public static String decode(String enc, int offset) {
return encode(enc, 26-offset);
}
public static String encode(String enc, int offset) {
offset = offset % 26 + 26;
StringBuilder encoded = new StringBuilder();
for (char i : enc.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + offset) % 26 ));
} else {
encoded.append((char) ('a' + (i - 'a' + offset) % 26 ));
}
} else {
encoded.append(i);
}
}
return encoded.toString();
}
}
我的问题是:
首先,我不明白这里如何使用modolus运算符来获取偏移量:
offset = offset % 26 + 26;
其次,为什么要使用StringBuilder
而不是String
进行连接
最后,我对这行代码有点迷茫。这在加密过程中是如何工作的?我所知道的是,当消息中的大写字母被加密时,它应该返回一个大写值
((字符)('A'+(i-'A'+偏移量)%26))
任何形式的帮助/解释都将不胜感激。- 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围
- StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
用于向其添加,而append
用于获取字符串作为结果toString
- 字符也是数字类型。例如,
是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法(int)('B'-'A')
产生一个字符A-Z'A'
- 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围
- StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
用于向其添加,而append
用于获取字符串作为结果toString
- 字符也是数字类型。例如,
是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法(int)('B'-'A')
产生一个字符A-Z'A'
- 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围
- StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
用于向其添加,而append
用于获取字符串作为结果toString
- 字符也是数字类型。例如,
是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法(int)('B'-'A')
产生一个字符A-Z'A'
- 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围
- StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
用于向其添加,而append
用于获取字符串作为结果toString
- 字符也是数字类型。例如,
是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法(int)('B'-'A')
产生一个字符A-Z'A'
- 这条线
offset = offset % 26 + 26;
涵盖传入的偏移量为负值的可能情况。在Java中,如果%
运算符的第一个参数为负,则答案将为负(或0)。如果为负值,则偏移量%26
使结果介于-25
和0
之间,因此添加26
将使其为正值(此处的结果非负值非常重要)。这样,添加偏移量并稍后执行%26
将确保生成的移位字符索引介于0
和25
之间
这里使用的StringBuilder
类的主要用途是构建String
,而无需为添加的每个字符创建一个临时String
对象,从而浪费资源——处理时间和内存
char
数据类型可以转换(并被认为)为int
值,该值是字符的Unicode值。大写字母'A'
到'Z'
分别由代码65
到90
表示。从char
中减去'A'
会得到一个int
,它介于0
和25
之间。添加偏移量,另一个%26
将加密的字符重新“环绕”到开头。例如,'Z'+3
=>25+3=>28=>2=>'C'
。您可以通过90
将'A'
添加回以获取65
。该值被转换回一个char
,以便