我是电工学领域的学生工业工程。我不习惯使用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"));
}
答案 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的长度。