![](/img/trans.png)
[英]Why do I get equals() == false when reading 2 seemingly identical Strings using a Scanner with next() and nextLine()?
[英]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
字段。 此外,在執行計算時,無需將char
為int
。 char
值已經是int
值的子集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.