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 转换而来。我在某个地方在线找到了该声明,我并没有完全自己编写它,所以该声明返回的到底是什么。
此代码的一般问题是对于 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));
}
}
最佳答案
好吧,我不确定这是否是家庭作业,所以我会在代码上吝啬。
你正在写一个 Caesar Cipher移动 5。
要解决您的 Z
-> _
问题...我假设您希望将所有字母更改为编码字母(而不是奇怪的符号)。问题是 A-Z
的 ASCII 值介于 65 和 90 之间。
在编码 Z
时(例如),您最终将其加 5,得到值 95 (_
)。
您需要做的是环绕可用的字母表。首先隔离字符在字母表中的相对位置(即 A = 0,B = 1 ...)您需要减去 65(这是 A
的 ASCII。添加您的 Shift
然后应用 modulus 26
。这将使您的值回绕。
例如,它是您的编码 Z
(ASCII=90),因此相对位置是 25 (= 90 - 65)。
现在,25 + 5 = 30,但您需要该值在 26 以内。所以您采用 modulus 26
所以 30 % 26
是 4
也就是 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()
来检查大写。
关于java - 从 ASCII 值到 Char 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784518/