使用扫描仪时输出结束时看似随机的字符

时间:2016-11-02 22:28:32

标签: java java-8 java.util.scanner

以下代码旨在加密和解密消息输入。当我加密和解密数据时,它有时会起作用,而在其他时候却不起作用。以下是我遇到的问题的一个例子。

加密

Encryption

解密

Decryption

正如您所看到的,当我尝试解密时,我的程序终止并且一些乱码输出到控制台。我的代码有什么问题?

我不确定是否提到这有帮助,但我将Eclipse的文件编码设置为UTF-8。

请原谅任何糟糕的代码。我仍然是Java的初学者,我很困惑为什么会这样。

import java.util.Scanner;

public class Transcrypt {

    static String mode = "",
                  msg,
                  key;

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

        while (!mode.equals("e") && !mode.equals("d")) { // Ask for mode until equal to "e" or "d"
            System.out.print("Encrypt or decrypt? (e/d) ");
            mode = input.nextLine().toLowerCase();
        }

        System.out.print("Message: "); // Ask for message
        msg = input.nextLine();

        System.out.print("Passkey: "); // Ask for key
        key = input.nextLine();

        input.close();

        System.out.println(transcrypt(msg, key, mode.equals("d"))); // Transcrypt and output
    }

    public static String transcrypt(String msg, String key, boolean decode) {
        String result = "";

        for (int i=0; i<msg.length(); i++) {
            // Add or subtract Unicode index of key.charAt(i % key.length()) and/from msg.msg.charAt(i) and convert back to character
            result += (char) ((int) msg.charAt(i) + ((int) key.charAt(i % key.length())) * (decode ? -1 : 1));
        }

        return result;
    }

}

1 个答案:

答案 0 :(得分:2)

您的编码邮件看起来像"¼ÊßàãÊãæÑ×",但实际上是"¼Êßàã\u0085ÊãæÑ×\u0095"

最值得注意的是,它包含中间的控制字符0x85,其中包含“新行”语义。因此,在复制该字符串时,您将使用它复制控制字符,并在应用程序查询消息时粘贴到控制台中,您基本上输入¼Êßàã作为消息,通过“新行”提交输入控制字符,导致后续查询密码使用尾随的ÊãæÑ×字符。

您在Passkey:输出后看到的垃圾是您尝试使用密钥¼Êßàã解码ÊãæÑ×的结果,因为此时没有输入换行符已经使用了控制台缓冲区中的字符。

一般来说,正如NándorElődFekete在this comment所说的那样,你不应该在控制台上写字符,实际上是二进制数据,比如编码字符串。

顺便说一下,您不应将变量声明为方法实际上是本地的static字段,即您的main方法。此外,在进行计算时,您无需将char强制转换为intchar值已经是int值的子集。