我试图比较输入中每个字符的ascii值,然后我想将其移动一定距离并将其重新转换为有效字符。 (使用凯撒加密算法)
public void Caesar_Cipher_Optimal(string input, int shift)
{
res = "";
int indx;
byte[] asciiInput = Encoding.ASCII.GetBytes(input);
foreach (byte element in asciiInput)
{
//compare if the current char is between[A-Z]
if(asciiInput[element] >= 65 && asciiInput[element] <= 90)
{
//convert the current value of element to int and add the shift value then mod 90
indx=((Convert.ToInt32(asciiInput[element])) + shift) % 90;
res += Convert.ToChar(indx).ToString();
}
}
}
当我测试代码时,它会给我一个OutOfRange异常,是否将当前ASCII值与我想要的值进行比较的正确方法是什么?
答案 0 :(得分:3)
使用foreach
中的值来表示你的数组访问权限超出范围异常,就像SLaks所示。
您不需要将字符转换为字节,因为您只处理A到Z范围内的字符。字符是16位值,并且很容易转换为字符代码作为整数。 / p>
你会使用模26而不是模90,否则你最终会得到字符代码从0到64的字符。你可以计算26作为'A'
和'Z'
之间的差异,以避免幻数。
直接对字符代码进行计算意味着您必须在事后检查以清除超出范围的值。而是将65-90范围转换为0-25,进行计算,然后转换回来。从字符代码中减去65('A'
),添加移位,应用模数,然后再添加65。
public static string Caesar_Cipher_Optimal(string input, int shift) {
return new String(
input.Where(c => c >= 'A' && c <= 'Z')
.Select(c => (char)((c - 'A' + shift) % ('Z' - 'A' + 1) + 'A'))
.ToArray()
);
}
答案 1 :(得分:2)
在这里,我修复了代码中的一些错误,现在可以正常使用了!
public void CaesarCipherOptimal(string input, int shift)
{
var res = "";
byte[] asciiInput = Encoding.ASCII.GetBytes(input);
// Loop for every character in the string, set the value to the element variable
foreach (byte element in asciiInput)
{
if (element >= 65 && element <= 90)
{
var indx = (element + shift - 65) % 26 + 65;
res += (char)indx;
}
}
return res;
}
以下是如何使用它:(可能在您的static void Main()
)
CaesarCipherOptimal("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10);