CRC校验(个人小结)

article/2025/9/27 14:26:09

前言

  • 之前曾经在通信原理课程学习过、也在项目中使用软件模拟过CRC校验。但是仍然有许多困惑的地方,在网上找的资料也是零零散散,于是自己根据课程学习、项目实践以及网上的资料,做一个小结。不当之处请在评论区指出。
  • 推荐一个CRC在线校验工具。

一. CRC校验

  1. CRC校验数字通信系统中的一种检错方法,主要利用除法和余数的原理来进行错误检测,并且实现简单,生成的检错码占用空间小

  2. 因为CRC校验码是通过整组信息序列校验序列得出的,即用待发送的信息序列多项式除以生成多项式,将最后的余数作为CRC校验码,所以检错正确率非常高。

  3. 常见CRC标准
    在这里插入图片描述

二. CRC校验举例

  1. 有一组m位信息序列X,将其转化为多项式,如8位信息序列1001 1010,转化为多项式即为x7+x4+x3+x;假设校验多项式Y为x8+x2+x+1,即为0x107;

  2. 因为校验多项式最高阶数为8,所以将信息序列X * 28组成新的序列K = x15+x12+x11+x9;将K除于校验多项式Y,得到余数(使用模2减法,不考虑借位)。
    在这里插入图片描述

  3. 上述求余运算,也可以用异或运算来实现:当新的序列K的首项为1时,则与校验序列异或;当K首项为0时,则将K左移;直到异或结果的最高阶数,小于校验序列。
    在这里插入图片描述

  4. 余数项Z为x7+x6+x3+x2+x+1,即1100 1111,将其添加至新的多项式K后面;即为K+Z=x15+x12+x11+x9+x7+x6+x3+x2+x+1,即1001 1010 1100 1111;该信息序列即为添加了CRC校验的最终发送序列。

  5. 在接收端接收了一组信息序列T,并已知约定好的校验多项式Y;使用T除于Y,若余数为0,则表示传输无差错,否则表示传输过程中发生错误。

三. CRC使用软件实现

  1. 存在问题:若是信息序列过长,根据异或求余的思路,会进行多次的移位和异或操作,占用系统运算资源且相对速度

  2. 改进方法:数字通信系统大多是以字节流的形式传输信息,所以可以用字节为基本单位,记录下每个字节的CRC校验码,组成一个线性表;这样就可以减小系统空间资源的占用(只需要256大小的数组空间),并且会大幅减少运算操作。

  3. 关于查表法的原理这里讲得很好,下面再举一个例子讲解一下这个原理。假设信息序列为1001 1010 1001 0101,校验序列为1 0000 0111,其对前8 bit的校验运算过程如下
    在这里插入图片描述
    可知前8位的校验结果为0x00 ^b1 ^b2 ^b3 ^b4 ^b5 ^b6 ^b7 ^b8 = B = 1100 1111;而前8位校验流程对后8位的影响为0x95 ^b1 ^b2 ^b3 ^b4 ^b5 ^b6 ^b7 ^b8 = 0x95 ^B = 1001 0101 ^ 1100 1111 = 0101 1010;因此我们可以以8位即以字节为单位,保存所有的校验结果在校验表中,总共有28=256种情况。每次对信息序列运算时,就可以以字节为单位,每一次根据当前字节从校验表中找到结果;再将结果与下一字节异或后,再以此从校验表中找到结果;循环往复。

  4. 这里举一个例子来说明查表法用法,仍然假设信息序列为1001 1010,校验序列为1 0000 0111;为了方便举例,以2 bit数据为基准建表,即得出00,01,10,11的余数项。
    在这里插入图片描述因此运算过程变为如下流程
    在这里插入图片描述

四. 代码示例

  • CRC8:初始和结束异或值为0x00,输入和输出数据不反转,校验序列为0x107,码流数据校验计算时从低地址处开始。
#define table_enble         1
#define CRC_8_Check         0x107       //1 0000 0111
#define CRC_8_Init          0x00
static void get_crc8(unsigned char *p,unsigned char len,unsigned char crc);unsigned char crc8_table[256]=
{0x0,0x7,0xe,0x9,0x1c,0x1b,0x12,0x15,0x38,0x3f,0x36,0x31,0x24,0x23,0x2a,0x2d,0x70,0x77,0x7e,0x79,0x6c,0x6b,0x62,0x65,0x48,0x4f,0x46,0x41,0x54,0x53,0x5a,0x5d,0xe0,0xe7,0xee,0xe9,0xfc,0xfb,0xf2,0xf5,0xd8,0xdf,0xd6,0xd1,0xc4,0xc3,0xca,0xcd,0x90,0x97,0x9e,0x99,0x8c,0x8b,0x82,0x85,0xa8,0xaf,0xa6,0xa1,0xb4,0xb3,0xba,0xbd,0xc7,0xc0,0xc9,0xce,0xdb,0xdc,0xd5,0xd2,0xff,0xf8,0xf1,0xf6,0xe3,0xe4,0xed,0xea,0xb7,0xb0,0xb9,0xbe,0xab,0xac,0xa5,0xa2,0x8f,0x88,0x81,0x86,0x93,0x94,0x9d,0x9a,0x27,0x20,0x29,0x2e,0x3b,0x3c,0x35,0x32,0x1f,0x18,0x11,0x16,0x3,0x4,0xd,0xa,0x57,0x50,0x59,0x5e,0x4b,0x4c,0x45,0x42,0x6f,0x68,0x61,0x66,0x73,0x74,0x7d,0x7a,0x89,0x8e,0x87,0x80,0x95,0x92,0x9b,0x9c,0xb1,0xb6,0xbf,0xb8,0xad,0xaa,0xa3,0xa4,0xf9,0xfe,0xf7,0xf0,0xe5,0xe2,0xeb,0xec,0xc1,0xc6,0xcf,0xc8,0xdd,0xda,0xd3,0xd4,0x69,0x6e,0x67,0x60,0x75,0x72,0x7b,0x7c,0x51,0x56,0x5f,0x58,0x4d,0x4a,0x43,0x44,0x19,0x1e,0x17,0x10,0x5,0x2,0xb,0xc,0x21,0x26,0x2f,0x28,0x3d,0x3a,0x33,0x34,0x4e,0x49,0x40,0x47,0x52,0x55,0x5c,0x5b,0x76,0x71,0x78,0x7f,0x6a,0x6d,0x64,0x63,0x3e,0x39,0x30,0x37,0x22,0x25,0x2c,0x2b,0x6,0x1,0x8,0xf,0x1a,0x1d,0x14,0x13,0xae,0xa9,0xa0,0xa7,0xb2,0xb5,0xbc,0xbb,0x96,0x91,0x98,0x9f,0x8a,0x8d,0x84,0x83,0xde,0xd9,0xd0,0xd7,0xc2,0xc5,0xcc,0xcb,0xe6,0xe1,0xe8,0xef,0xfa,0xfd,0xf4,0xf3
};int main()
{unsigned char str[10] = {0x02,0x04,0x05,0x77,0x12,0x7B,0xF1,0xE4,0x1A};#if table_enbleget_crc8(str,9,CRC_8_Init);#endif#if !table_enble /*导出CRC表*/unsigned short i = 0;for(i = 0;i <= 0xFF;i ++) {str[0] = i;get_crc8(str,1,CRC_8_Init);}#endifreturn 0;
}static void get_crc8(unsigned char *p,unsigned char len,unsigned char crc)
{unsigned char index;unsigned char i,j;for(i = 0;i < len;i ++) {#if table_enbleindex = crc^(*p);crc = crc8_table[index];#elsecrc ^= (*p);for(j = 0;j < 8;j ++) {if(crc & 0x80) {crc <<= 1;crc ^= CRC_8_Check;} elsecrc <<= 1;}#endifp ++;}printf("0x%x,",crc);
}

参考:

  • 循环冗余检验 (CRC) 算法原理

以上是我对CRC校验算法的一个小结,不当之处请在评论区指出。


http://chatgpt.dhexx.cn/article/enOBgptm.shtml

相关文章

CRC码校验纠错原理

在接收端收到了CRC码后用生成多项式为G(x)去做模2除&#xff0c;若得到余数为0,则码字无误。若如果有一位出错&#xff0c;则余数不为0&#xff0c;而且不同位出错&#xff0c;其余数也不同。可以证明&#xff0c;余数与出错位的对应关系只与码制及生成多项式有关&#xff0c;而…

CRC校验详解(附代码示例)

目录 1.CRC校验原理 2.生成多项式 3.以CRC-16校验为例讲解编程实现 3.3.1 完全按照CRC原理实现校验 3.3.2 工程中常用CRC校验过程 3.3.3 改进的CRC校验过程 4.以CRC-8校验为例讲解查表法 5.以CRC-16校验为例讲解查表法 5.1.生成表格 5.2.查表法实现 6.代码链接 CRC校…

详述CRC校验码(附代码)

关注星标公众号&#xff0c;不错过精彩内容 来源 | 一口Linux CRC校验应用比较广泛&#xff0c;通常在通信领域用的比较多&#xff0c;即便是自定义通信协议&#xff0c;也可以添加CRC校验码&#xff0c;使其通信更加可靠。 今天就来进一步描述CRC校验码。 一、CRC概念 1. 什么…

【科普】CRC校验(一)什么是CRC校验?

目录 CRC&#xff08;循环冗余校验&#xff09; CRC 校验码的生成 CRC 的发送方与接收方 发送方 接收方 除法异或运算示意图 CRC&#xff08;循环冗余校验&#xff09; CRC&#xff08;Cyclic Redundancy Check&#xff09;循环冗余检验&#xff0c;是一种用于检测数字数…

CRC校验原理及其C语言实现

文章目录 目录前言CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结参考资料 目录 前言CRC算法简介CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结 前言 最近的工作中&#xff0c;要实现对通信数据的CRC计算&#xff0c;所以花了两天的时间好好研…

Oracle Toad 导数,麒峰

标签&#xff1a; 补丁下载 x86 ia64 操作系统 迅雷下载 oracle it (2011-05-26 10:28) 标签&#xff1a; 授予的权限 主键约束 对象 角色管理 数据字典 oracle it 系统权限&#xff1a; create table :create any table: drop table: create procedure: execute anycedure: cr…

最优捕捞

一、问题重述 为了保护人类赖以生存的自然环境&#xff0c;可再生资源&#xff08;如渔业、林业资源&#xff09;的开发必须适度。一种合理、简化的策略是&#xff0c;在实现可持续收获的前提下&#xff0c;追求最大产量或最佳效益。 假设这种鱼分4个年龄组&#xff1a;称1龄…

短期趋势自用经传捕捞季节 通达信指标公式副图 源码 贴图

指标公式描述 短期趋势自用经传捕捞季节 通达信指标公式副图 源码 贴图 图示: 指标源码&#xff1a; WY1001:(2*CLOSEHIGHLOW)/4; WY1002:EMA(WY1001,2); WY1003:EMA(WY1002,2); WY1004:EMA(WY1003,2); XYS0:(WY1004-REF(WY1004,1))/REF(WY1004,1)*100; STICKLINE(XYS0>0,X…

股票指标使用 - 捕捞季节

股票指标里面我觉得这个指标是最实用的了&#xff0c;XX软件里面流行起来的。作为IT男&#xff0c;任何带有逻辑运算的都会让我感兴趣。 接下来就用简单易懂的文字介绍下这个指标怎么看(百度上搜到的都说了那么深奥) 如图&#xff1a; 优势&#xff1a;相对MACD指标来说&…

捕捞季节 通达信副图指标公式 源码

捕捞季节是一个趋势型指标&#xff0c;主要用于&#xff08;超&#xff09;短线的股价运行趋势状态监控。捕捞季节通达信指标公式主要用途是用来做短期买卖点操作的指标公式&#xff0c;适合那些做短期买卖的股民。 【指标用法】 紫色线上穿黄色线为金叉买入信号&#xff0c;…

通达信指标:捕捞季节

通达信【捕捞季节】指标 WY1001:(2CLOSEHIGHLOW)/3; WY1002:EMA(WY1001,3); WY1003:EMA(WY1002,3); WY1004:EMA(WY1003,3); XYS0:(WY1004-REF(WY1004,1))/REF(WY1004,1)100; STICKLINE(XYS0>0,XYS0,0,2,0),COLORRED; STICKLINE(XYS0<0,XYS0,0,2,0),COLORGREEN; PJGJ:AMO…

x86服务器与arm服务器

服务器是提供计算服务的设备&#xff0c;服务器的构成包括处理器、硬盘、内存、系统总线等&#xff0c;和通用的计算机架构类似&#xff0c;但是由于需要提供高可靠的服务&#xff0c;因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。在网络环境下…

服务器 raid配置

这里写目录标题 首先启动Server在启动界面&#xff0c;按键盘ESC或Del键进入BIOS。设置启动模式为“LEGACY”传统模式&#xff0c;F4 保存并退出重启服务器。ctrlA进入raid配置 首先启动Server在启动界面&#xff0c;按键盘ESC或Del键进入BIOS。 设置启动模式为“LEGACY”传统模…

TaiShan服务器介绍

TaiShan服务器系列介绍 TaiShan 100服务器2016年 基于Kunpeng916处理器 最多16各DDR4内存 支持5个PCIe 3.0扩展插槽 支持SAS/SATA硬盘和SSD 支持板载GE/10GE网络 TaiShan 200服务器2019年 基于Kunpeng 920处理器 最多支持32个DDR4内存 支持最多8个PCLe 4.0扩展插槽 支持NVMe …

中国服务器销售排名,IDC Q3:华为FusionServer Pro智能服务器发货量、销售额荣登中国区x86标准服务器排名双冠王...

据IDC发布的《中国区服务器季度跟踪报告》显示&#xff0c;2020年第三季度中国区x86标准服务器市场(标注1)&#xff0c;华为FusionServer pro智能服务器发货量及销售额双居中国区第一(标注2)&#xff0c;其中机架、高密型号服务器&#xff0c;均列单品类发货量、销售额第一&…

华为x86服务器年销售额,卖了荣耀后,华为又要卖资产?这次是国内第2的X86服务器...

去年11月份&#xff0c;华为将荣耀卖了&#xff0c;从那以后荣耀独立了&#xff0c;开始了自由发展。 为何要卖荣耀&#xff0c;其实大家都知道的&#xff0c;华为把荣耀拿在手中&#xff0c;只能是等死&#xff0c;因为没有足够的芯片供应&#xff0c;荣耀无法推出新手机&…

x86服务器部署kylin v10(arm版)虚拟机

本次讲解在x86 linux环境下使用qemu进行arm版银河麒麟的部署&#xff0c;适用于运维人员进行相关项目的趟雷操作 qemu、VMware、docker区别 讲到虚拟机&#xff0c;得益于windows环境下的盛行&#xff0c;很多人第一时间想到的是VMware。亦或者考虑到部署的方便&#xff0c;考…

中国 X86 服务器市场 10 年来首次负增长

IDC《2019年第一季度中国X86服务器市场跟踪报告》显示&#xff0c;2019年第一季度中国X86服务器市场出货量662,504台&#xff0c;同比下滑0.7%&#xff1b;市场规模35.90亿美元&#xff08;约合240.90亿元人民币&#xff09;&#xff0c;同比增长13.5%。 2018年第一季度中国X86…

浪潮x86服务器芯片,用别人的芯片,做自己的X86服务器:国内浪潮第一,华为第二...

众所周知&#xff0c;在PC领域&#xff0c; X86 架构的芯片是一家独大的&#xff0c;虽然目前也有一些厂商想要向X86架构发起挑战&#xff0c;比如华为去年推出了鲲鹏主板&#xff0c;想将 鲲鹏920 用于PC&#xff0c;但就目前来讲&#xff0c;还需要很长时间。 所以一直以来&a…

2020年x86服务器厂商TOP10最新榜单,精彩不?

【全球财经观察 | 阿明微评】x86服务器市场的变化&#xff0c;阿明一直在关注&#xff0c;因为云计算的根基之一就是服务器。 x86服务器厂商这些年的发展也很有意思&#xff0c;首先看资本运作带来的影响。 在服务器整体市场领域&#xff0c;不管是因为资本组合形成新竞争力&…