CRC校验
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
提示:以下是本篇文章正文内容,下面案例可供参考
一、CRC简介
CRC校验是为了检验通信双方数据传输是否出错的一种校验码,可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即CRC校验码),来判断接收的数据是否正确。在发送端,根据要传送的k位二进制码序列,以一定的规则(CRC校验有不同的规则。这个规则,在差错控制理论中称为“生成多项式”。)产生一个校验用的r位校验码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则(即与发送时生成CRC校验码相同的规则)进行检验,校验采用计算机的模二除法,即除数和被除数(即生成多项式)做异或运算,进行异或运算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,传输错误。
二、CRC校验算法
1. CRC8校验的一般性算法:
2、计算过程
下面以顺序异或的例子说明一些计算的过程:
使用多项式:x8+x5+x4+1(二进制为:100110001)
计算一个字节:0x11(二进制为:00010001)
计算步骤:
A、 因为采用顺序异或,所以需要计算的数据左移8位,
移位后数据为:0001 0001 0000 000
B、 先进行高9bit异或(多项式为9bit),0001 0001 0000 0000,因为高9bit的
最高bit为0,不需要进行异或,同理,接下来的两bit也是0,也不需要进行进行异或。
这样处理后数据为:1 0001 0000 0000;
C、 接下来最高位为1,需要进行异或操作了
从上面的计算过程可以看到,多项式最高位为1,遇到需要异或数据最高位为1时,
才进行异或计算,并且异或后,最高位就为0了,最高位为0,下次也不需要异或了,这样需要采用代码计算的方式,就可以把最高位去掉,不需要异或,最后结果也是一样的。对于上面的计算过程,采用代码实现的方式如下:
————————————————
unsigned char cal_table_high_first(unsigned char value)
{
unsigned char i, crc;
crc = value;
/* 数据往左移了8位,需要计算8次 */
for (i=8; i>0; --i)
{
if (crc & 0x80) /* 判断最高位是否为1 */
{
/* 最高位为1,不需要异或,往左移一位,然后与0x31异或 */
/* 0x31(多项式:x8+x5+x4+1,100110001),最高位不需要异或,直接去掉 */
crc = (crc << 1) ^ 0x31; }
else
{
/* 最高位为0时,不需要异或,整体数据往左移一位 */
crc = (crc << 1);
}
}
return crc;
}
参考博主:简单的过客原文链接文章来源:https://www.toymoban.com/news/detail-411867.html
三、项目内使用CRC校验参考代码
返回值为得到的CRC校验码。
文章来源地址https://www.toymoban.com/news/detail-411867.html
#include<CRC.h>
#define POLYNOMIAL 0x2F
#define CRC8_INIT 0xAA
//最大长度0xFF BlockLength<=0xFF
unsigned char CRC8_Calc(unsigned char *BlockStart,unsigned char BlockLength)
{
unsigned char i,j;
unsigned char CRC_VAL = CRC8_INIT;
for (j=0; j<BlockLength; j++){
CRC_VAL = *(BlockStart + j) ^ CRC_VAL;
for (i=0; i<8; i++){
if (CRC_VAL & 0x80){
CRC_VAL <<= 1;
CRC_VAL ^= POLYNOMIAL;
}
else{
CRC_VAL <<= 1;
}
}
}
return CRC_VAL;
}
到了这里,关于CRC8校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!