CRC8校验算法源码——C语言版

2024-06-12 11:20

本文主要是介绍CRC8校验算法源码——C语言版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  本文以CRC8实际代码为例启发各位读者,如何编写一个CRC的校验算法。让各位读者直接跳过繁琐的原理说明阶段,快速应用到工程当中。

一、例程介绍

        CRC的校验有很多很多种,掌握以下思路,写任何一个CRC的源生代码都应该没有问题。

   本文使用的示范代码为本人编写,算法为CRC-8-MAXIM,多项式为X^8+X^5+X^4+1,即0x31

初始值为0xFF,结果异或值0x00,输入数据和输出数据均不反转。

1.多项式计算的方法

    有很多人不知道这个0x31是怎么来的,这里为大家计算一下展开的话就是

1*x^8+0*x^7+0*x^6+1*x^5+1*x^4+0*x^3+0*x^2+0*x^1+1*x^0 对应二进制1 0011 0001 即0x131

CRC8校验取低字节,那么多项式的值就是0x31了

1.反转解释

   意思就是将低位变高位,再进行计算

例如:0001 1100 0010 1001 反转后得到的就是 0011 1000 1001 0100

二、代码示例

1.计算法

#include  <stdio.h>unsigned char CRC8_MAXIM(unsigned char *dat,unsigned int len){unsigned char  crc_value=0xFF,j; //初始值为0xff,也有很多初始值为0x00的,此处可修改unsigned int    i;for(i=0;i<len;i++){crc_value ^= *dat++;for(j=0;j<8;j++){if(crc_value&0x80){crc_value=(crc_value<<1)^0x31;//其余的CRC校验算法修改该多项式的值即可}else{crc_value=(crc_value<<1);}}}return crc_value;
}/*使用示例*/
int main(void)
{unsigned char buff[2]={0xbe,0xef};printf("crc=%X\n", CRC8_MAXIM(buff,2));return 0;
}

2.查表法

        查表法的原理就是把已经计算出来的值放入一个数组内,这里教大家一个小技巧,用代码写代码,255个值总不能自己去一个个算出来手敲吧。

调用刚刚的计算法函数,编写如下代码,然后在一个C在线编译工具打印出来即可

int main(void)
{unsigned int k=256; //因为本示例代码的初始值是0xff,所以这里要注意,表格要倒序//如果初始值是0x00,那表格应该换成正序的unsigned char buff[2]={0xbe,0xef};printf("unsigned char CRC8_MAXIM_TABLE[256]={ \n");while(k--){    /*初始化为0x00时应替换为 for(k=0;k<255;k++)*/printf("0x%.2x,",CRC8_MAXIM(&k,1));if(k%8==0){printf("\n");   }}printf("}; \n");return 0;
}

打印出来的数组如下:

unsigned char CRC8_MAXIM_TABLE[256]={ 
0x00,0x31,0x62,0x53,0xc4,0xf5,0xa6,0x97,
0xb9,0x88,0xdb,0xea,0x7d,0x4c,0x1f,0x2e,
0x43,0x72,0x21,0x10,0x87,0xb6,0xe5,0xd4,
0xfa,0xcb,0x98,0xa9,0x3e,0x0f,0x5c,0x6d,
0x86,0xb7,0xe4,0xd5,0x42,0x73,0x20,0x11,
0x3f,0x0e,0x5d,0x6c,0xfb,0xca,0x99,0xa8,
0xc5,0xf4,0xa7,0x96,0x01,0x30,0x63,0x52,
0x7c,0x4d,0x1e,0x2f,0xb8,0x89,0xda,0xeb,
0x3d,0x0c,0x5f,0x6e,0xf9,0xc8,0x9b,0xaa,
0x84,0xb5,0xe6,0xd7,0x40,0x71,0x22,0x13,
0x7e,0x4f,0x1c,0x2d,0xba,0x8b,0xd8,0xe9,
0xc7,0xf6,0xa5,0x94,0x03,0x32,0x61,0x50,
0xbb,0x8a,0xd9,0xe8,0x7f,0x4e,0x1d,0x2c,
0x02,0x33,0x60,0x51,0xc6,0xf7,0xa4,0x95,
0xf8,0xc9,0x9a,0xab,0x3c,0x0d,0x5e,0x6f,
0x41,0x70,0x23,0x12,0x85,0xb4,0xe7,0xd6,
0x7a,0x4b,0x18,0x29,0xbe,0x8f,0xdc,0xed,
0xc3,0xf2,0xa1,0x90,0x07,0x36,0x65,0x54,
0x39,0x08,0x5b,0x6a,0xfd,0xcc,0x9f,0xae,
0x80,0xb1,0xe2,0xd3,0x44,0x75,0x26,0x17,
0xfc,0xcd,0x9e,0xaf,0x38,0x09,0x5a,0x6b,
0x45,0x74,0x27,0x16,0x81,0xb0,0xe3,0xd2,
0xbf,0x8e,0xdd,0xec,0x7b,0x4a,0x19,0x28,
0x06,0x37,0x64,0x55,0xc2,0xf3,0xa0,0x91,
0x47,0x76,0x25,0x14,0x83,0xb2,0xe1,0xd0,
0xfe,0xcf,0x9c,0xad,0x3a,0x0b,0x58,0x69,
0x04,0x35,0x66,0x57,0xc0,0xf1,0xa2,0x93,
0xbd,0x8c,0xdf,0xee,0x79,0x48,0x1b,0x2a,
0xc1,0xf0,0xa3,0x92,0x05,0x34,0x67,0x56,
0x78,0x49,0x1a,0x2b,0xbc,0x8d,0xde,0xef,
0x82,0xb3,0xe0,0xd1,0x46,0x77,0x24,0x15,
0x3b,0x0a,0x59,0x68,0xff,0xce,0x9d,0xac
}; 

现在就可以开始用查表法进行计算了,代码如下:


#include  <stdio.h>unsigned char crc8_maxim(unsigned char *puchMsg, unsigned int usDataLen) 
{ unsigned char uchCRC = 0xFF ;unsigned int i=0;while (usDataLen--) /* 传输消息缓冲区 */ // for(i=0;i<usDataLen;i++){ uchCRC = CRC8_MAXIM_TABLE[uchCRC^*puchMsg++]; } return uchCRC ; 
}/*使用示例*/
int main(void)
{unsigned char cs[2]={0xbe,0xef};printf("crc=%x\n",crc8_maxim(&cs[0],2));return 0;
}

总结

     CRC的计算法和查表法各有各的优点,查表法的时间复杂度要低,占用内存空间较大,适合于大的数据段计算,计算法会比较耗时,占用空间很小,数据越长所需要的时间就越长,适合于小的数据段计算。

这篇关于CRC8校验算法源码——C语言版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054072

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get