C#如何在循环外部获取有效计算后的FinalCheckSum变量值
问题:NMEA校验和计算后无法获取正确的finalCheckSum值
你正在尝试计算NMEA字符串的校验和,用来验证数据是否有误,已经实现了过滤GPGGA语句的逻辑,但发现循环执行后finalCheckSum始终是初始值0,没法在循环外拿到正确的计算结果。
你的原始代码如下:
List<string> richTextBoxLines = richTextBox1.Lines.ToList(); richTextBoxLines.RemoveAll(x => !x.Contains("GPGGA")); richTextBox1.Lines = richTextBoxLines.ToArray(); NOLbox.Text = richTextBox1.Lines.Count().ToString(); int finalCheckSum = 0; string sumOfBytes = richTextBox1.Lines[0].Split('*').First().Substring(1); for (int i = 0; i == sumOfBytes.Length; i++) { finalCheckSum ^= Convert.ToByte(sumOfBytes[i]); } checksumValue.Text = finalCheckSum.ToString();
问题根源
你写的循环条件i == sumOfBytes.Length完全错误啦!这个条件只有当sumOfBytes的长度是0时才会成立(此时i初始是0),正常情况下循环根本不会执行,所以finalCheckSum一直保持初始的0值。
修正后的代码
把循环条件改成i < sumOfBytes.Length,这样才能遍历sumOfBytes中的每一个字符,正确计算校验和:
List<string> richTextBoxLines = richTextBox1.Lines.ToList(); richTextBoxLines.RemoveAll(x => !x.Contains("GPGGA")); richTextBox1.Lines = richTextBoxLines.ToArray(); NOLbox.Text = richTextBox1.Lines.Count().ToString(); // 变量在循环外声明是正确的,只要循环正常执行就能拿到正确值 int finalCheckSum = 0; // 这里建议先判断Lines是否有内容,避免索引越界 if(richTextBox1.Lines.Length > 0) { string sumOfBytes = richTextBox1.Lines[0].Split('*').First().Substring(1); // 修正循环条件:遍历每个字符 for (int i = 0; i < sumOfBytes.Length; i++) { finalCheckSum ^= Convert.ToByte(sumOfBytes[i]); } } // 额外补充:NMEA校验和通常是两位十六进制字符串,建议转成十六进制展示 checksumValue.Text = finalCheckSum.ToString("X2");
额外说明
- 增加了
richTextBox1.Lines.Length > 0的判断,避免当没有过滤到GPGGA语句时出现索引越界异常。 - 把最终结果转成两位十六进制字符串(
ToString("X2")),因为NMEA协议里的校验和是两位十六进制格式,这样更方便和原始字符串里的校验和对比。
现在finalCheckSum在循环外就能拿到正确的计算值了,你可以直接用它做后续的校验对比操作~
内容的提问来源于stack exchange,提问作者Mantirius
相关产品推荐
相关产品推荐

