簡體   English   中英

使用掃描儀時,輸出末尾似乎是隨機字符

[英]Seemingly Random Characters at End of Output When Using Scanner

下面的代碼旨在加密和解密輸入的消息。 當我加密和解密數據時,它有時可以工作,而在其他時候則不能。 以下是我遇到的問題的示例。

加密

加密

解密

解密

如您所見,當我嘗試解密時,我的程序終止了,並且在控制台中輸出了一些亂碼。 我的代碼有什么問題?

我不確定是否提到這會有所幫助,但是我將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;
    }

}

您的編碼消息看起來像"¼ÊßàãÊãæÑ×" ,但實際上是"¼Êßàã\…ÊãæÑ×\•"

最值得注意的是,它之間包含控制字符0x85 ,其具有“換行符”的語義。 因此,在復制該字符串時,您將同時復制控制字符,並在應用程序查詢消息時將其粘貼到控制台中時,您基本上是在輸入¼Êßàã作為消息,該輸入是通過“新行”控制字符提交的,從而導致隨后的密碼查詢將消耗尾隨的ÊãæÑ×字符。

您在Passkey:輸出之后立即看到的垃圾是您嘗試使用鍵ÊãæÑ×解碼¼Êßàã的結果,因為此時已輸入新行,因為已使用控制台緩沖區中已經存在的字符,因此沒有輸入換行符。

通常,正如NándorElődFekete在此評論中已經說過的那樣,您不應將實際上是二進制數據的字符寫入控制台,例如編碼字符串。


順便說一句,您不應該將變量聲明為實際上是方法(即您的main方法)本地的static字段。 此外,在執行計算時,無需將charint char值已經是int值的子集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM