嵌入式开发:抑或校验和

目录

工作原理:

应用:

特点:

代码解析:


亦或校验和(XOR Checksum)是一种数据校验方法,它通过对数据中所有字节(或比特)进行异或(XOR)操作来生成一个校验值。异或操作是按位操作,两个相同的比特异或结果为0,两个不同的比特异或结果为1。这个校验和可以用来检测数据在传输或存储过程中是否发生了错误。

工作原理:

  1. 对数据流中的每个字节进行异或操作。
  2. 最终的结果(即校验和)是所有字节的异或结果。

举个例子,假设有一个数据流包含以下字节(用十六进制表示):

0x12, 0x34, 0x56
  1. 对0x12和0x34进行异或操作:

    0x12 ^ 0x34 = 0x26
    
  2. 再对结果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;

    • 这行代码初始化了一个变量 result0,它将用于存储计算得到的校验值。
  • while (len--)

    • 这是一种循环方式,len-- 每次递减 len,直到 len0 时停止循环。也就是说,循环会执行 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 ^= 0x12result = 0x12
  • 第二次循环:result ^= 0x34result = 0x26
  • 第三次循环:result ^= 0x56result = 0x72
  • 最终返回的 result 就是 0x72,这就是 FCS 校验值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魂兮-龙游

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值