消息解码/加密程序输出JAVA

时间:2015-03-05 03:31:43

标签: java

我对我编写的程序正在输出的内容感到非常困惑。该程序的目的是解码/编码为一种名为Caesar Shift的代码,它基本上只取一个单词/句子的每个字母,并通过一个" shift键"将它移到右边。 (例如ab,换档键1 = bc)。

我设置了程序,以便它向用户询问加密/解密,然后是要编码/解码的消息,然后是移位键。我的编码/解码功能也遇到了同样的问题。我会专注于这个问题的编码,因为它们几乎是一样的。

基本上,我设置了编码功能,以便它接受String消息和int ShiftKey的参数。我有一个消息的每个字母的字符串数组。我的计划是遍历数组/单词中的每个字母,在字母表中找到它的当前索引,并将shift键添加到它,它存储在int finalIndex中。我在索引finalIndex附加字母表的字母,最后打印出单词。

public static void encode(String message, int shiftKey)
{
    String [] array = message.split("");
    String encoded = "";
    for (String a : array)
    {
        int finalIndex;
        int index = alphabet.indexOf(a);
        finalIndex = index + shiftKey;
        encoded += alphabet.charAt(finalIndex);
    }
    System.out.println(encoded);
}

问题在于,当我运行程序时,输出是正确的,除了在编码短语的开头,输出总是有一个额外的字母,它是shiftKey上字母的索引。 例如,如果我输入消息" hi",使用shift键1,则输出" bij",因为b是索引1处的字母表,hi只是预期的班次。

我已经尝试了一切,但我无法弄清楚为什么会发生这种情况。我确定这个功能有问题,而不是其他任何地方,因为我试图隔离不同的区域以查看问题所在。

非常感谢任何帮助。感谢。

完整代码

import java.util.*;
import java.io.*;
public class CaesarShiftTester
{
public static void main (String[] args)
{
    boolean running = true;
    while (running){
        Scanner in = new Scanner (System.in);
        System.out.println("Encryption or Decryption? (E/D): " );
        String answer = in.next();

    if (answer.equalsIgnoreCase("e"))
    {
        System.out.println("Enter message: ");
        String message = in.next();
        System.out.println("Enter Shift Key: " );
        int shiftKey = in.nextInt(); 
        CaesarShiftEncryption.encode(message, shiftKey);

        System.out.println("Quit? (Y/N): ");
        String again = in.next();
        if (again.equalsIgnoreCase("Y"))
            running = false;
        else
            running = true;
    }

    else if (answer.equalsIgnoreCase("d"))
    {
        System.out.println("Enter message: ");
        String message = in.next();
        System.out.println("Enter Shift Key: " );
        int shiftKey = in.nextInt();
        CaesarShiftEncryption.decode(message, shiftKey);

        System.out.println("Quit? (Y/N): ");
        String again = in.next();
        if (again.equalsIgnoreCase("Y"))
                running = false;
        else
            running = true;
    }
    }


}
}

\

import java.io.*;
import java.util.*;
public class CaesarShiftEncryption
{
private static final String alphabet = "abcdefghijklmnopqrstuvwxyz";
public static void encode(String message, int shiftKey)
{
    String [] array = message.split("");

    String encoded = "";
    for (String a : array)
    {
        System.out.println(a);

        int finalIndex;
        int index = alphabet.indexOf(a);
        finalIndex = index + shiftKey;
        System.out.println(finalIndex);
        encoded += alphabet.charAt(finalIndex);
    }
    System.out.println(encoded);
}


public static void decode(String message, int shiftKey)
{
    char shifted;
    String encoded = "";
    for (int i = 0; i < message.length(); i ++)
    {
        char nextChar = message.charAt(i);
        shifted = (char)(nextChar - shiftKey);
        encoded += shifted;
    }
    System.out.println("Encoded: " + encoded);  
 } 
 }

2 个答案:

答案 0 :(得分:2)

JDK问题。

考虑使用JDK 8 ..

在JDK 7上,如果你执行split(“”),则split函数会在开头添加一个额外的元素。

如果无法更新,可以使用char [],或者只跳过第一个(将增强的for循环更改为传统的循环)

我测试了你的代码并且工作正常..这就是为什么如此令人困惑..然后我将JDK更改为版本7,并且遇到了和你一样的问题。

答案 1 :(得分:1)

问题在于您使用message.split("")功能。它在数组中添加了一个空元素。

以下代码有效。

public class test {

  public static void main (String args[])
  {
    char[] array = "ab".toCharArray();
    String alphabet = "abc";
    String encoded = "";
    int shiftKey = 1;

    for (char a : array)
    {
        int finalIndex;
        int index = alphabet.indexOf(a);
        finalIndex = index + shiftKey;
        encoded += alphabet.charAt(finalIndex);
    }

    System.out.println(encoded);
  }    
}

同样使用toCartArray()方法更适合此用例。