接收数据校验代码中异或和与零比较的逻辑困惑
这段异或校验逻辑的原理
先把你贴的代码重新整理如下:
// 接收到的数据 const char data[n] unsigned char low = 0; unsigned char high = 0; for(int i = 0; i < n; i += 2) { low ^= data[i]; high ^= data[i+1]; } if(low != 0 || high != 0) { // 输出错误 return; }
这种校验方式的核心逻辑是发送端和接收端执行完全一致的异或计算,并且发送端会把自己算出的校验值附加在原始数据末尾一起发送。
具体拆解:
- 发送阶段:先对原始业务数据的偶数索引位(第1、3、5...个字节,对应代码里的
data[i],i从0开始)逐个异或,得到结果low_send;再对奇数索引位(第2、4、6...个字节,对应data[i+1])逐个异或,得到high_send。随后把这两个值作为最后两个字节,拼在原始数据后面,组成最终发送的data[n](n = 原始数据长度 + 2)。 - 接收阶段:代码会对整个接收到的
data[n](包括末尾的两个校验字节)重复同样的异或计算:- 最终
low的结果是「原始数据偶数位异或值」异或「校验字节low_send」,也就是low_send ^ low_send = 0 - 最终
high的结果是「原始数据奇数位异或值」异或「校验字节high_send」,也就是high_send ^ high_send = 0
- 最终
- 如果传输过程中任何一个字节出现错误(比如某一位被翻转),对应的异或累积结果就会偏离0,这时代码就会判定数据出错,终止后续处理。
本质上这是一种分奇偶位的异或校验机制,通过让校验值参与异或抵消,来验证数据的完整性。
内容的提问来源于stack exchange,提问作者Николай Шлиппе
相关产品推荐
相关产品推荐

