You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"); 

额外说明

  1. 增加了richTextBox1.Lines.Length > 0的判断,避免当没有过滤到GPGGA语句时出现索引越界异常。
  2. 把最终结果转成两位十六进制字符串(ToString("X2")),因为NMEA协议里的校验和是两位十六进制格式,这样更方便和原始字符串里的校验和对比。

现在finalCheckSum在循环外就能拿到正确的计算值了,你可以直接用它做后续的校验对比操作~

内容的提问来源于stack exchange,提问作者Mantirius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:32:26