如何理解CRC循环冗余校验——图解CRC算法模型和C语言实现
创始人
2024-03-04 12:03:41
0

如何理解CRC循环冗余校验

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种产生定长校验码的算法,主要用来检测或校验数据传输或者保存后可能出现的错误。

它真的太常见了,上至应用软件通信和网络数据传输,下至芯片烧写、主从设备交互,好像凡是涉及通信,就免不了存在CRC校验。但它又太令人陌生了,习以为常地使用它,默认它的存在却不了解它的实现,想起来也的确是一件憾事,故而翻了翻论文,写点笔记放在这里。


1 资料追溯

据这篇文章

Tingilkar K, Reddy S K. Improvement Of Memory Data Corrections By Using CRC Technique For Fault Torrent Applications[J].

CRC理论最初由W. Wesley Peterson于1961年发表。


基本概念
简单说来,这个算法就是一个求给定序列的校验和(checksum)的算法:

CRC (Cyclic Redundancy Check) is a checksum algorithm.

它是定长多项式与输入比特流做模二除法以后的余数:

CRC is the remainder after division of a long input binary bitstream with fixed length polynomial.

我们也可以把CRC算法理解为一个有任意初值的移位寄存器。例如:输入比特流不断左移,在最左端的那一位满足条件时,通过规定的运算更新寄存器的值,最后寄存器里剩下的那个数就是我们要求的校验和:

CRC can also be considered as shift register. Original register value can be zero or non-zero.
Input bitstream is fed bit by bit and when it is finished, left register value is called ‘CRC’.

这里所说的“规定的运算”,就是让寄存器的值和多项式做异或运算:

Register is XORed with polynomial after every bit shift if out MSB value is ‘1’.


2 图解算法

需要形象一些的话,可以看下面这张图。输入比特流Input bits一位一位地进入一个左移寄存器(Left Shift Register, LSR),假如最左端出去的那一bit是1的话,左移寄存器的值就更新为当前LSR中的值与多项式异或的结果。然后再输入下一bit。

请添加图片描述


3 参数

从图解中可以知道,要实现CRC,至少需要知道左移寄存器的位宽和初值、用以进行异或运算的多项式(一个位宽与左移寄存器一致的0/1序列),此外再知道输入比特流和它的长度就可以进行CRC计算了。

/*
------------------------------------------------
CRC需要的参数		说明
------------------------------------------------
位宽				寄存器、多项式和校验和的位宽
输入				输入比特流的内容
输入长度				输出比特流的bit数
------------------------------------------------
*/

4 库

可以使用Github仓库:crc-lib-c
包含头文件就可以使用

#include 
#include 
#include "crcLib.h"int main()
{uint8_t data;	//输入uint8_t crc;	//输出data = 0x34;	//8-bits比特流输入(0011 0100)crc = crc8_maxim(&data, 1);		printf("data:%02x, crc:%02x\n", data, crc);return 0;
}

这个仓库里还有在线工具:CRC在线计算器


相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...