-4

実際、code[A] を使用すると実行に失敗します。理由がわかりません。また、最初に -'A'、次に +'A' ということもわかりません。[A] が失敗するのはなぜですか? 【ロ】元気ですか?

Code [A]  (char) (ch + key) % 26 )
Code [B]  (char) ('A' + ((ch -'A' + key) % 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;
    }
    /**Why can't use ( (ch + key) % 26 )*/

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

2 に答える 2

2

あなたが何を求めているのか理解できれば...

ここでの機能は、'A'文字をアルファベットの序数位置に対応する数字に変換することです。

(ch -'A' + key) % 26は、文字の序数位置とキー変数の値に応じて、0から25の範囲の値を生成します。

于 2013-03-06T15:55:37.380 に答える
1

[A] フォームは0~ を25含む値を提供し、[B] フォームは'A'~ を'Z'含む値を提供します。それらは明らかに同じ表現ではありません。


この観点から 2 つの形式を読むと、[B] 形式での の最初の使用は、結果の値が から までの範囲内'A'に留まることを確認することです。 'A''Z'

'A'差し引かれる2 番目の用途は、 Caesar 暗号化を適切に実装する必要があります。削除すると、別の暗号化になります。(はアルファベットの回転を- 'A'確実にkey選択しkeyます。これがないと、encryptCaesar(a, key)実際には が計算されreal_caesar(a, (key - 64) % 26)ます。つまり、別のキーを使用した Caesar 暗号化になります。)

しかし、これは、2 つのバージョンのコードを「手動で実行」して、入力文字が出力文字にどのようにマップされるかを確認すれば明らかです。

于 2013-03-06T15:52:47.353 に答える