嘿,最近我的任務是創建一個應用程序,該應用程序讀取消息并使用 Java 中的凱撒密碼對其進行加密。直到我遇到添加數字密碼會將字母 az/AZ 轉換為特殊符號的部分時,我才真正遇到問題,我真的不知道該怎么做。這是我的解決方案的代碼:private String caesarCipher(String message) { Scanner input = new Scanner(System.in); StringBuilder cipher = new StringBuilder(); char ch; int key; System.out.print("Enter a key: "); key = Integer.parseInt(input.nextLine()); for(int i = 0; i < message.length(); i++) { ch = message.charAt(i); if(ch >= 'a' && ch <= 'z'){ ch = (char)(ch + key); if(ch > 'z'){ ch = (char)(ch - 'z' + 'a' - 1); } cipher.append(ch); } else if(ch >= 'A' && ch <= 'Z'){ ch = (char)(ch + key); if(ch > 'Z'){ ch = (char)(ch - 'Z' + 'A' - 1); } cipher.append(ch); } else { cipher.append(ch); } } return cipher.toString();}有人可以向我解釋以下陳述背后的過程和推理嗎:if(ch > 'z'){ ch = (char)(ch - 'z' + 'a' - 1);}
1 回答

慕森卡
TA貢獻1806條經驗 獲得超8個贊
它永遠不會允許加密字符超出其假定的范圍,即 a - z。a 和 z 的 ascii 分別為 97 和 122,您只希望凱撒密碼加密在此字符范圍內。
這將檢查 的 ascii 代碼是否ch
大于 z 的 ascii代碼
if(ch > 'z'){
如果是,它將計算:(ascii of ch
) - (ascii of z
) + (ascii of a
) - 1。
ch = (char)(ch - 'z' + 'a' - 1);
它被翻譯成ch = (char)(ch - 122 + 97 - 1);
假設您想用a
密鑰加密字符3
。該程序將采用 97 (ascii of a
) + 3。您將得到 100,這是 的 ascii d
。然而,如果你想z
用密鑰加密怎么辦3
?
和以前一樣,需要 122 (ascii of z
) + 3 = 125。但是,在 97 - 122 (az) 范圍內找不到 125。因此,您將得到一個不需要的字符(在本例中,125 是 的 ascii }
)。
因此,(ch - 'z' + 'a' - 1)
將確保任何超過 ascii 122 的字符都將被轉換回 ascii 范圍僅包含 97 和 122 的字符。在 125 的示例中,ch = (char)(125 - 122 + 97 - 1)
=> ch = (char)(99)
=> ch = c
。
添加回答
舉報
0/150
提交
取消