目录
亦或校验和(XOR Checksum)是一种数据校验方法,它通过对数据中所有字节(或比特)进行异或(XOR)操作来生成一个校验值。异或操作是按位操作,两个相同的比特异或结果为0,两个不同的比特异或结果为1。这个校验和可以用来检测数据在传输或存储过程中是否发生了错误。
工作原理:
- 对数据流中的每个字节进行异或操作。
- 最终的结果(即校验和)是所有字节的异或结果。
举个例子,假设有一个数据流包含以下字节(用十六进制表示):
0x12, 0x34, 0x56
-
对0x12和0x34进行异或操作:
0x12 ^ 0x34 = 0x26
-
再对结果0x26与0x56进行异或操作:
0x26 ^ 0x56 = 0x72
最终的校验和是0x72。
应用:
- 错误检测:接收端可以用相同的方式计算接收到的数据的校验和,并与发送端的校验和进行比较。如果两个校验和不同,说明数据在传输过程中发生了错误。
- 通信协议:在通信协议中,常使用亦或校验和来进行简单的错误检测。
特点:
- 亦或校验和是一个简单且快速的算法,但它并不能提供非常强的错误检测能力。它只能检测出一些类型的错误,如偶数个比特翻转的错误,但不能检测出所有类型的错误。
代码解析:
- 这个
calcFCS
函数的作用是计算一个给定数据的 FCS(Frame Check Sequence),也叫 校验和。它使用的是 异或 操作来逐个字节计算校验和。 -
unsigned char calcFCS(unsigned char *pMsg, unsigned char len) { unsigned char result = 0; // 初始化结果为0 while (len--) // 循环遍历数据 { result ^= *pMsg++; // 将当前字节与结果进行异或操作 } return result; // 返回计算得到的校验和 }
-
unsigned char result = 0;
- 这行代码初始化了一个变量
result
为0
,它将用于存储计算得到的校验值。
- 这行代码初始化了一个变量
-
while (len--)
- 这是一种循环方式,
len--
每次递减len
,直到len
为0
时停止循环。也就是说,循环会执行len
次,遍历数据数组中的每个字节。
- 这是一种循环方式,
-
result ^= *pMsg++;
*pMsg
是当前指针指向的数据字节,它与当前的result
进行异或操作。^=
是异或赋值操作符,它表示将result
和*pMsg
进行异或,结果存储回result
变量。pMsg++
使得指针pMsg
移动到下一个字节,准备对下一个字节进行操作。-
这个表达式的执行顺序是:
pMsg++
:首先执行pMsg++
,即指针pMsg
先获取当前的值(*pMsg
),然后指针自增(pMsg++
)。*pMsg
:接着取出当前pMsg
指向的值。result ^= *pMsg
:然后将result
和*pMsg
进行异或操作,并将结果存储回result
。-
因此,
++
操作会先作用于pMsg
,然后再进行异或操作。
-
return result;
- 循环结束后,返回最终计算得到的
result
,即所有字节异或计算的结果,这就是FCS(校验和)。
- 循环结束后,返回最终计算得到的
- 初始化
result = 0
- 第一次循环:
result ^= 0x12
→result = 0x12
- 第二次循环:
result ^= 0x34
→result = 0x26
- 第三次循环:
result ^= 0x56
→result = 0x72
-
最终返回的
result
就是0x72
,这就是 FCS 校验值。