Caesar Cipher帮助ASCII循环

时间:2014-07-19 03:41:20

标签: java loops encryption ascii

我正在尝试创建一个caesar密码,我将输入作为程序中的硬代码。当我运行该程序时,它可以工作,但应该是一个" Y"是"?"。我无法弄清楚如何循环ASCII,所以当它小于65时,它会增加26或循环回90.这是我到目前为止的代码。转变为-3来解读它。

import java.util.Scanner;


public class Caesar {

public static void main(String[] args)
{
  Scanner in = new Scanner(System.in);

  System.out.print("Enter the shift value");

  int shiftValue = in.nextInt();




String ciphertext = "WKHQHZRUNLQJDQGFBEHUVHFXULWBGHSDUWPHQWDWURVHVWDWHF ROOHJHRIIHUVDFHUWLILFDWHSURJUDPLQLQIRUPDWLRQVHFXULWBDW DOOIHGHUDOWUDLQLQJOHYHOVWKHSURJUDPFHUWLILHVWKHVWXGH QWVVDWLVIBLQJSURJUDPUHTXLUHPHQWVDUHWUDLQHGWRWKHIHGH UDOQVWLVVLFQVVLVWDQGDUGVIRULQIRUPDWLRQVBVWHPVVHFXUL WBSURIHVVLRQDOVGHVLJQDWHGDSSURYLQJDXWKRULWLHVLQIRUPD WLRQVBVWHPVHFXULWBRIILFHUVVBVWHPVFHUWLILHUVDQGULVNDQ DOBVWUHVSHFWLYHOB";
//System.out.print(ciphertext);
System.out.println();
//I take each character, convert it to its ascii value, subtract 3,
//then convert back to a character



for(int i=0; i <= 48; i++) {        
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=49; i <= 102; i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
System.out.println();
for(int i=103; i < 152; i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
System.out.println();
for(int i=152; i < 200; i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
System.out.println();
for(int i=200; i < 248; i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
System.out.println();
for(int i=248; i < 307; i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
System.out.println();
for(int i=307; i < 348; i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
System.out.println();
for(int i=348; i < ciphertext.length(); i++) {
    System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
    }
//System.out.print((char)((int)ciphertext.charAt(1)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(2)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(3)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(4)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(5)+shiftValue));
//System.out.println();

}

} // end main
// end class Assign1

2 个答案:

答案 0 :(得分:1)

你可以检查结果值是否超出大写字母的范围并适当地调整它:

char cipher(char input,int shift){
    shift%=26;            //incase the shift is really big
    input+=shift;         //first shift the input charachter
    if(input>'Z')         //if its over 'Z' shift it down into range
        input-=26;
    else if(input <'A')   //if its below 'A' shift it up into range
        input+=26;
    return input;        
}

此外,使用String []作为输入会更容易,而不是计算每个lne结束的位置

答案 1 :(得分:1)

首先,我建议采取这个:

(char)((int)ciphertext.charAt(i)+shiftValue)

并使其成为一个单独的方法:[1]

public char newChar(char oldChar, int shiftValue) {
    return (char)((int)ciphertext.charAt(i)+shiftValue);
}

现在我们有了这种方法,我们可以问一下这是怎么回事。如果您致电newChar('B', -3),则所需的输出为Y,您实际获得的内容为?

public char newChar(char oldChar, int shiftValue) {
    int value = (int)ciphertext.charAt(i);
    value = value + shiftValue;
    // do something here
    return (char) value;
}

这可能是学校作业,所以我不会为您填写所有细节。我希望这能为你提供一条如何进行的明确途径。

[1]任何时候你多次写同样的东西,它都是refactoring的好候选人。