校验和模数为256 C#的问题

时间:2015-11-16 13:39:51

标签: c# serial-port range checksum modulo

我是电工学领域的学生工业工程。我不习惯使用c#。我试图使校验和由2个字节组成。 校验和使用以下算法计算:

A = 0xFF 
B = 0 

For I FROM 0 TO number_of_bytes -1 DO 
   A := (A + DATA[I]) mod 0x100; 
   B := (B + A) mod 0x100; 
END 

checksum[0] := A 
checksum[1] := B

A和B是字节值,并且添加modulo 256

当我运行该程序时,它会在A += byteToCalculate[i];处中断 出现此警告:

  

“communicatie.exe中发生了'System.IndexOutOfRangeException'类型的异常,但未在用户代码中处理。”

有人可以帮我解决这个问题吗?

    public void ChecksumBerekenen(object sender, EventArgs e)
    {

        byte[] byteToCalculate = new byte[] { 0x00, 0x02, 0x02, 0x00, 0x58, 0x04, 0x00, 0x00, 0x05, 0x00, bytewaarde_2[3], bytewaarde_2[2], bytewaarde_2[1], bytewaarde_2[0] };

        int A = 0xff;
        int B = 0;

        for (int i = 0; i <= byteToCalculate.Length ; i++)
        {
            A += byteToCalculate[i];
            A %= 0x100;

            B += A ;
            B %= 0x100;
        }
        VerstuurdeData.AppendText(A.ToString("x") + " " + B.ToString("x"));
    }

2 个答案:

答案 0 :(得分:2)

为了避免此类讨厌的错误<=而不是必需的<),请使用 foreach 循环:

  foreach (var item in byteToCalculate) {
    A += item;
    A %= 0x100;

    B += A;
    B %= 0x100;
  }

并且您将获得更多可读代码作为奖励。

答案 1 :(得分:0)

错误在于:for (int i = 0; i <= byteToCalculate.Length ; i++)

您想要for (int i = 0; i < byteToCalculate.Length ; i++)

数组索引从0开始,因此您希望迭代到小于1的长度。