dポイントプレゼントキャンペーン実施中!

javaというか文字列について少し質問です><


javaというか文字列について少し質問です><
お願いします。
シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・

String decrypt(String str,int key)
{


StringBuffer sb = new StringBuffer(); // もしくはStringBuilder

for(int i=0;i<str.length();i++){
char c=str.charAt(i);
c=(char)((int)c-key);

sb.append( c );
}

こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

A 回答 (1件)

こう何回も同じ人に答えられると逆にうざったいと思いますが、ちょっと思いついたのでよかったら参考にしてください(笑)



10進数で計算しているのでaが97、zが122で処理をしています。

まず、zよりも大きくなった時は、zとの差を計算し、越えた分だけ96に足すとうまくaからスタートします。(小文字が97から始まるため)

次にaよりもcの値が小さくなってしまった場合ですが、この場合はzから数えるのでしょうか?それともaから数えるのでしょうか?

どっちか分からなかったため、両方考えてみました。
zから数える場合、aよりどれくらい小さいのかを計算し、zから戻っていくので123から弾いていきます。
aから数える場合は96に足していくことでaから数えていくことができます。

ちょっと説明が下手なのでうまく伝わるか分かりませんが、質問主様のお役に立てれば幸いです。
ソースは以下のようになります。

for(int i=0;i<str.length();i++){
char c=str.charAt(i);
c=(char)((int)c-key);

if(c >122) c = (char)((c - 122) + 96);//zを超えていたらzとの差を計算し、最初から数えなおす。
else if(c < 97) c = (char)(123 - (97 - c)); //aよりも小さく、かつzから数える場合
//else if(c < 97) c = (char)((97 - c)+96); //aよりも小さく、かつaから数える場合


sb.append( c );
}
    • good
    • 0
この回答へのお礼

なんどもありがとうございました。
全体的にはすぐできたのにこういう細部で苦戦してしまいました。
ホントにありがとうございました><

お礼日時:2010/06/06 10:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!