2010-09-24 41 views
1
String source = "WEDGEZ" 
char letter = source.charAt(i); 
shift=5; 
for (int i=0;i<source.length();i++){ 
if (source.charAt(i) >=65 && source.charAt(i) <=90) 
    letterMix =(char)(('D' + (letter - 'D' + shift) % 26)); 
} 

好吧我想要做的是采取字符串WEDGEZ,并将每个字母移5,所以W变成B和E变成J等,但我觉得有一些与我使用的数字不一致。对于if语句,我使用ASCII值,对于letterMix =语句,我使用1-26(我认为)中的数字。实际上,问题也是这样的:(char)(('D'+(letter - 'D'+ shift)%26));无论如何返回?它返回一个char权限,但是从int转换而来。我在网上发现了一个声明,我没有完全自己编写它,所以声明返回的是什么。Java Int&ASCII问题

这段代码的普遍问题是,用W返回“/”和Z轴方向返回_,我猜意味着它使用的ASCII值。我真的不知道如何解决这个问题。

编辑:新的代码

for (int i=0;i<source.length();i++) 
     { 
     char letter = source.charAt(i); 
     letterMix=source.charAt(i); 
     if (source.charAt(i) >=65 && source.charAt(i) <=90){ 
      letterMix=(char)('A' + ( ((letter - 'A') + input) % 26)); 
      } 
     } 
+0

这是'homework'? – st0le 2010-09-24 05:51:01

+0

你是否查找过你的角色的实际ASCII值? – 2010-09-24 05:55:34

+0

是的,我从那里得到了65和90。 – newtojava 2010-09-24 05:56:54

回答

5

嗯,我不知道这作业,所以我会吝啬的代码。

你正在写一个Caesar Cipher与5

转变为了解决您的Z - >_问题...我假设你希望所有的字母变成编码的字母(而不是怪异符号)。问题是A-Z谎言65和90之间 的ASCII值。当编码Z(对于例如),则最终加入5到它,这给u对应的值95(_)。

你需要做的是纸环绕可用字母。首先分离,字符中字母的相对位置(即A = 0,B = 1 ......),你需要减去65(这是A ASCII。添加您Shift,然后应用modulus 26,这将导致你的价值如果你的编码是Z,(ASCII = 90),所以相对位置是25(= 90-65)。现在,25 + 5 = 30,但你需要的值在26.所以你需要modulus 26 所以30 % 264这是E

所以这里

char letter = message(i); 
int relativePosition = letter - 'A'; // 0-25 
int encode = (relativePosition + shift) % 26 
char encodedChar = encode + 'A' // convert it back to ASCII. 

所以在同一行,

char encodedChar = 'A' + ( ((letter - 'A') + shift) % 26) 

注意,这只会工作,为大写,如果您计划使用较低的情况下,你需要一些额外的处理。

您可以使用Character.isUpperCase()检查大写。

+0

非常感谢。这真的有帮助!它解决了很多问题,但是当我使用负移位值时,我仍然遇到问题。例如,如果我使用-4,而我在字母C,我想得到Y​​,但是我得到了一些标点符号。我在纸上手动运行代码,看看我会得到什么,它应该正常工作。我不知道为什么它不是。请参阅我正在使用的代码的编辑。 – newtojava 2010-09-24 17:40:23

+0

@newtojava,这是java中的优点,'mod'运算符也给出了负值......一个简单的解决方法,就是在解密之前添加'if(shift <0)shift + = 26;'和这次不要减去它,使用相同的'+'符号。 – st0le 2010-09-24 20:00:02