C#索引异常未处理

时间:2015-03-31 20:41:30

标签: c# encryption

所以我这样做是为了一个学校项目。它的小程序是在两个方向加密一些密码而且我从编码加密回到正常版本。它应该读取2个加密版本的字符,用匹配的char替换它们并将其返回到字符串。导致原始传递中的每个字符都被加密版本中的2个字符替换,通常为,...或类似字符。 这就是我被困住的地方,无论我做什么,以下异常都不会消失

else
{
    string target;
    text = "";
    password = richTextBox2.Text;
    for (int i = 0; i <= password.Length; i += 2)
    {
        target = Convert.ToString(password[i])
            + Convert.ToString(password[i + 1]);
        if (target == ",,")
        {
            text += "a";
        }
    }
    richTextBox3.Text = text;
}

3 个答案:

答案 0 :(得分:1)

关闭一个错误。由于您测试i <= password.Length,当i等于password.Length时,您将进入循环,当您尝试OutOfBoundsException时会导致Password[i] - 因为字符串是基于0的索引,所以你应该在此之前停止。在这种情况下,请将<=更改为<

for (int i = 0; i <= password.Length - 1; i += 2)

编辑我已针对password.Length - 1添加了一项检查,因为您还访问password[i + 1],这可能会导致同样的问题

添加一些检查并确保password包含偶数个字符也可能会有所帮助,或者您可能遇到同样的问题,因为您的增量为2。

答案 1 :(得分:1)

只是为了冒险猜测我会认为你的for循环一次推进2个字符将是通过超过字符串结尾导致索引异常的主要嫌疑人。

无论密码长度如何,写入的方式都可能发生。因此,如果您的密码长度为6,您将检查索引0&amp; 1,然后2&amp; 3,然后4&amp;此时循环表示5是<= 6所以让我们检查索引6&amp; 7,但由于您的密码长度为6,因此您的最高索引为5,因此您会获得“BOOM” - 由于索引超出范围而导致异常。

同时,如果您的密码长度为5,它将检查索引对0&amp; 1,2和&amp; 3,然后4&amp; 5你会再次爆炸,因为索引5对于长度为5的密码来说太大了,因为它的最高索引是4。

我认为这可能是您问题的原因。

要带走的关键是密码长度属性从1开始计算,而索引(以及循环计数器)从0开始。因此,当密码长度为6时,您需要检查索引0,1,2,3,4和&amp; 5但你的代码是用来检查索引0,1,2,3,4,5和&amp; 6(每次至少一次)。

我强烈建议创建一个函数,其唯一目的是获取一个偶数长度的字符串,然后返回该字符串的加密版本。这可能就像将循环比较修复为length-1一样简单:

string target;
text = "";
password = richTextBox2.Text;
for (int i = 0; i <= password.Length - 1; i += 2)
{
    target = Convert.ToString(password[i]) + Convert.ToString(password[i + 1]);
    if (target == ",,")
    {
        text += "a";
    }
}
richTextBox3.Text = text;

为了使其适用于所有字符串,您需要为奇数长度字符串提出策略。您可能需要以不同方式加密第一个或最后一个字符,或者在密码的前面或后面添加空白字符,或者对加密算法起作用的任何字符。只要你找到一种方法来获取奇数长度的字符串并使它们均匀或允许你像对待它们一样对待它们。

答案 2 :(得分:1)

您遇到了一个错误的错误。索引通常为零,表示第一项为[0],第二项为[1],依此类推。您尝试访问10的长度为[10]的字符串会给您一个例外,因为最后一个元素实际上是[9]。因此,您的条件需要使用<而不是<=,以便它永远不会超过最后一个元素索引。