crc校验(CRC8)——查表法

最近接触到了crc校验,特此记录:

首先总结了几个公式 :

crc(a^b) = crc(a)^crc(b);        (1)

crc(0xA0) = (crc(0xA)<<4)^crc(crc(0xA)>>4)     (2)

由(1)(2)推:

crc(0xAB) = crc(0xA0^0xB)= crc(0xA0)^crc(0xB) 

                                                =  (crc(0xA)<<4)^crc(crc(0xA)>>4) ^ crc(0XB)

                                                =(crc(0xA)<<4)^crc((crc(0xA)>>4)^0xB)        (3)

不难发现,crc(0xA)可以用一个容量为16的数组存储起来,可节约大量算力,16个字节的储存空间对单片机来说也很小;使用公式(3)可以写出一个较为快速的crc校验。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
crc8校验的原理,程序和检验软件 CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 CRC校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即CRC校验码),来判断接收的数据是否正确。在发送端,根据要传送的k位二进制码序列,以一定的规则(CRC校验有不同的规则。这个规则,在差错控制理论中称为“生成多项式”。)产生一个校验用的r位校验码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则(即与发送时生成CRC校验码相同的规则)进行检验,校验采用计算机的模二除,即除数和被除数(即生成多项式)做异或运算,进行异或运算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,传输错误。 CRC8即最终生成的CRC校验码为1字节,其生成多项式,生成多项式为g(x)=x8+x5+x4+1,相当于g(x)=1•x8+0•x7+0•x6+1•x5+1•x4+0•x3+0•x2+0•x1+1•x0,即对应的二进制数为100110001。 CRC8校验算: 1.CRC8校验的一般性算: 例如: 信息字段代码为: 00000001 00000010 ———— 对应m(x)=x8+x 生成多项式为:g(x)=x8+x5+x4+1 ———— 对应g(x)的二进制代码为:100110001 现在我们将要对2字节数据0x0102生成CRC8校验码,并最终将生成的1字节CRC校验码跟在0x0102的后面,即 0x01 02 ##,(##即8为CRC码),最终生成的3字节数据就是经CRC8校验生成的数据。 先计算x8m(x)=x16+x9,对应的2进制数为:100000010 00000000 。可以看到这样运算所得到的结果其实就是将信息字段代码的数左移8位。因为最终要将生成的8位CRC8校验码附在信息字段的后面,所以要将信息字段的数左移8位。最后用x8m(x)得到的二进制数对生成多项式g(x)进行模二运算,最终的余数(其二进制数的位数一定比生成多项式g(x)的位数小)就是所要的CRC8校验码。 100000010 00000000 ^ 100110001 --------------------------- 000110011 00000000 ^ 100110 001 --------------------------- 010101 00100000 ^ 10011 0001 --------------------------- 00110 00110000 ^ 100 110001 --------------------------- 010 11110100 ^ 10 0110001 --------------------------- 00 10010110 对x8m(x)做模二运算取余得10010110(0x96),这个8位的二进制数就是CRC8校验码。所以,经CRC8校验后研发送的数据就是0x010296。 2.CRC8校验在DS18B20中的应用: 以上分析的是常规的CRC8校验方。在DS18B20中,有两处用到CRC。一是DS18B20的8字节的序列号,最后一字节是前面七个字节的CRC码,这是为了保证序列号的唯一性与正确性;另一个是在DS18B20内部9字节的高速温度存储器,其第9字节是前面8个字节的CRC校验码,这是为了温度数据传输的正确性。而在DS18B20中生成CRC码所用到的方不同于常规生成算,它采用的是逆序CRC信息单元编码算,该CRC的生成是由DS18B20中的多项式寄存器通过其中所包含的移位寄存器以及异或门对输入该多项式寄存器的每一位二进制数做一定的运算所得到的CRC码(可以查看Maxim官网上DS18B20的应用笔记Note27,专门介绍DS18B20CRC详细生成过程)。在此列举两种DS18B20CRC校验的C程序。
CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方,它可以对数据进行校验,确保数据的完整性。 查表是一种高效实现CRC校验的方,其核心思想是事先生成一张CRC校验表,根据输入的数据一位一位地查表,直到最后一位为止,得到一个校验码。 以下是一个CRC校验查表的代码示例: ```c #include <stdio.h> #include <stdint.h> #define POLY 0x1021 // CRC-CCITT 多项式 0x1021 // 生成CRC校验表 void generateCRCTable(uint16_t table[256]) { for (int i = 0; i < 256; i++) { uint16_t crc = ((uint16_t)i) << 8; for (int j = 0; j < 8; j++) { crc = (crc & 0x8000) ? ((crc << 1) ^ POLY) : (crc << 1); } table[i] = crc; } } // 进行CRC校验 uint16_t getCRC(uint8_t *data, int length, uint16_t table[256]) { uint16_t crc = 0; for (int i = 0; i < length; i++) { crc = (crc << 8) ^ table[((crc >> 8) ^ data[i]) & 0xFF]; } return crc; } int main() { uint16_t crcTable[256]; uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05}; int dataLength = sizeof(data) / sizeof(data[0]); generateCRCTable(crcTable); uint16_t crc = getCRC(data, dataLength, crcTable); printf("CRC: 0x%04X\n", crc); return 0; } ``` 此代码中,首先通过调用`generateCRCTable`函数生成了CRC校验表,然后在`getCRC`函数中使用该表进行校验。最后,我们使用一个示例数据进行CRC校验,并输出结果。 CRC校验查表通过预先生成一张CRC校验表,可高效地进行CRC校验操作,对于大量数据的处理具有优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值