簡體   English   中英

有關字符串加密計划的錯誤:(char)(ch + key)%26

[英]The error about string encryption scheduling : (char) (ch + key) % 26

問題一:這是兩個代碼微調器。 代碼A運行錯誤。 但是我不知道怎么了。

問題二:代碼B是正確的,但是我不明白為什么它需要刪除'A'。 然后在fmod之后添加“ A”。 “ A”有什么作用? 為什么刪除后有錯誤?

代碼A(ch +鍵)%26)

代碼B('A'+(((ch -'A'+鍵)%26))

 public void run() {    
        setFont("Arial-PLAIN-24");
        String line = readLine ("Enter line: ");
        int key = readInt ("Enter key: ");
        String siphertext = encryptCaesar(line , key);
        println("The result is: " + siphertext);
        String newplain = encryptCaesar(siphertext , -key);
        println("newplain:" + newplain);    
    }

    private String encryptCaesar(String str , int key){
        if(key < 0){
            key = 26 - ( -key % 26 );
        }

        String result = "";
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);        
            result += encryptChar(ch,key);
        }
        return result;
    }

    private char encryptChar(char ch, int key){
        if(Character.isUpperCase(ch)){
            return ( (char) ('A' + ((ch -'A' + key) % 26)) );
        }
        return ch;
    }

15.7.3余數運算符%

...根據此規則,余數運算的結果僅在股息為負的情況下才為負,而在股息為正的情況下才可以為正。

然后提供一個示例:

int e = (-5)%3; // -2
int f = (-5)/3; // -1
System.out.println("(-5)%3 produces " + e +
                   " (note that (-5)/3 produces " + f + ")");

如果((ch -'A' + key) % 26))的結果為負,則(char) ('A' + ((ch -'A' + key) % 26))的結果不是是一些非字母字符? 也許您需要在任何負值上加上26或找到絕對值,以使它們為正數並產生實際的字母字符。

添加'A'以確保“ encryptChar”方法的結果是ASCII范圍為64 to 90的有效字符,即A (CAPITAL) to Z (CAPITAL) 請在此處參考ASCII表。

在您的代碼中,減去“ A”也可以忽略。 那下面的也行,

('A' + ((ch + key) % 26))

暫無
暫無

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

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