我有一个用于Java的终止密码,它工作正常,但我尝试解码的消息的空格为"_"。它们落在z之后,并且当移位1时应为“ A”。我该如何将其添加到代码中?我试着用"_"替换“ z”,以为那样容易,但是随后将"_"更改为"`"

import java.util.*;
public class CaesarCipherProgram {
    public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    System.out.println(" Input the ciphertext message : ");
    String ciphertext = sc.nextLine();
    System.out.println(" Enter the shift value : ");
    int shift = sc.nextInt();
    String decryptMessage = "";
    for(int i=0; i < ciphertext.length();i++)

    {
        // Shift one character at a time
        char alphabet = ciphertext.charAt(i);
        // if alphabet lies between a and z
        if(alphabet >= 'a' && alphabet <= 'z')
        {
            // shift alphabet
            alphabet = (char) (alphabet - shift);

            // shift alphabet lesser than 'a'
            if(alphabet < 'a') {
                //reshift to starting position
                alphabet = (char) (alphabet-'a'+'z'+1);
            }
            decryptMessage = decryptMessage + alphabet;
        }
            // if alphabet lies between A and Z
        else if(alphabet >= 'A' && alphabet <= 'Z')
        {
         // shift alphabet
            alphabet = (char) (alphabet - shift);

            //shift alphabet lesser than 'A'
            if (alphabet < 'A') {
                // reshift to starting position
                alphabet = (char) (alphabet-'A'+'Z'+1);
            }
            decryptMessage = decryptMessage + alphabet;
        }
        else
        {
         decryptMessage = decryptMessage + alphabet;
        }
      }
      System.out.println(" decrypt message : " + decryptMessage);
   }
}

最佳答案

您可以这样重写逻辑:

private static final String KEY = "abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String shift(String input, int amount) {
    final int keyLen = KEY.length();
    final int shift = (amount % keyLen + keyLen) % keyLen;
    char[] buf = input.toCharArray();
    for (int i = 0; i < buf.length; i++) {
        int idx = KEY.indexOf(buf[i]);
        if (idx != -1)
            buf[i] = KEY.charAt((idx + shift) % keyLen);
    }
    return new String(buf);
}


测试

System.out.println(shift("Hello World", -1));
System.out.println(shift("Hello World", 0));
System.out.println(shift("Hello World", 1));
System.out.println(shift("Hello World", 2));
System.out.println(shift("Hello World", 3));
System.out.println(shift("Hello World", 30));
System.out.println(shift(shift("Hello World", 30), -30));
System.out.println(shift(shift("Hello World", 30), 23));


输出量

Gdkkn Vnqkc
Hello World
Ifmmp Xpsme
Jgnnq Yqtnf
Khoor Zruog
lHOOR _RUOG
Hello World
Hello World

关于java - 如何在凯撒密码中包含“_”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57965139/

10-11 19:15