理解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
    用于获取字符串作为结果

  • 字符也是数字类型。例如,
    (int)('B'-'A')
    是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法
    'A'
    产生一个字符A-Z

      • 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围

      • StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
        append
        用于向其添加,而
        toString
        用于获取字符串作为结果

      • 字符也是数字类型。例如,
        (int)('B'-'A')
        是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法
        'A'
        产生一个字符A-Z

          • 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围

          • StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
            append
            用于向其添加,而
            toString
            用于获取字符串作为结果

          • 字符也是数字类型。例如,
            (int)('B'-'A')
            是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法
            'A'
            产生一个字符A-Z

              • 这里使用模运算符强制值介于26和51(包括26和51)之间<代码>偏移量%26介于0和25之间,加上26将使其达到该范围

              • StringBuilder对于字符串的效率高于基本连接,因为不需要为每次连接创建新对象
                append
                用于向其添加,而
                toString
                用于获取字符串作为结果

              • 字符也是数字类型。例如,
                (int)('B'-'A')
                是1,A+3是D,依此类推。大写字符是一个连续块,而小写字符是一个单独的连续块。减法将字母a-Z转换为数字0-25。加法和模运算产生另一个数字0-25,加法
                'A'
                产生一个字符A-Z

                • 这条线

                  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
                  ,以便