C语言标准CRC-8校验函数

CRC校验原理及简单CRC-8校验函数(7个输入字节以内)可参考: CRC校验原理及CRC-8简单校验函数设计 。

这里的函数是实现输入范围扩展,支持任意长度的输入字节的CRC-8校验。

设计原理

设计原理仍然基于无符号64位整型为一个计算单元,当超过64位时,将前一个单元的计算余数,与后面的输入数据重新组成64位数据,再进行模二除法,以此类推,得到最后的CRC-8校验值(余数)。设计按照CRC计算基本原理来实现,更容易理解。

CRC-8校验函数

这里的校验码采用标准校验码X^8 + X^2 + X^1 + 1,对于其它类型的CRC-8校验码或有输入数据前处理或输出数据后处理的情况,相应的做代码简单调整即可。CRC-8校验函数如下:

#include <stdio.h>
#include <stdlib.h>
uint8_t PY_CRC_8(uint8_t *di, uint32_t len)
{   //Written by Pegasus Yu 2022/04/22uint16_t crc_poly = 0x0107; //X^8+X^2+X^1+1 total 9 effective bits. Computed total data shall be compensated 8-bit '0' before CRC computing.uint8_t *datain;uint64_t cdata = 0; //Computed total datauint16_t data_t = 0; //Process data of CRC computinguint16_t index_t = 63;  ///bit shifting index for initial '1' searchinguint16_t index = 63;    //bit shifting index for CRC computinguint8_t rec = 0; //bit number needed to be compensated for next CRC computinguint32_t cn=(len+1)/7;uint32_t cr=(len+1)%7;uint32_t j;datain = malloc(len+1);for(j=0;j<len;j++){datain[j]=di[j];}datain[len]=0; //Compensate 8-bit '0' for input dataif(len<=7){for(j=0;j<=len;j++){cdata = (cdata<<8);cdata = cdata|datain[j];}cn = 1;}else{if(cr==0){cr=7;}if(cr==1){cr=8;}else{cn++;}for(j=0;j<cr;j++){cdata = (cdata<<8);cdata = cdata|datain[j];}}do{cn--;while(index_t>0){if( (cdata>>index_t)&1 ){index = index_t;index_t = 0;data_t |= (cdata>>(index-8));{data_t = data_t ^ crc_poly;}while((index!=0x5555)&&(index!=0xaaaa)){/*if ((data_t>>7)&1) rec = 1;else if ((data_t>>6)&1) rec = 2;else if ((data_t>>5)&1) rec = 3;else if ((data_t>>4)&1) rec = 4;else if ((data_t>>3)&1) rec = 5;else if ((data_t>>2)&1) rec = 6;else if ((data_t>>1)&1) rec = 7;else if ((data_t>>0)&1) rec = 8;else rec = 9; */for(uint8_t n=1;n<9;n++){if ((data_t>>(8-n))&1) {rec = n;break;}if (n==8) rec=9;}if((index-8)<rec){data_t = data_t<<(index-8);data_t |=  (uint16_t)((cdata<<(64-(index-8)))>>(64-(index-8)));index = 0x5555;}else{for(uint8_t i=1;i<=rec;i++){data_t = (data_t<<1)|((cdata>>(index-8-i))&1) ;}if(rec!= 9){data_t = data_t ^ crc_poly;index -= rec;}else{data_t = 0;index_t = index-8-1;index = 0xaaaa;}}}if(index==0x5555) break;}else{index_t--;if(index_t<8) break;}}if(cn>0){cdata = data_t&0x00ff;for(uint8_t k=0;k<7;k++){cdata = (cdata<<8);cdata = cdata|datain[j++];}data_t = 0;index_t = 63;  ///bit shifting index for initial '1' searchingindex = 63;    //bit shifting index for CRC computingrec = 0; //bit number needed to be compensated for next CRC computing}}while(cn>0);free(datain);return (uint8_t)data_t;
}

CRC-8校验效果

通过在线CRC-8校验工具对比本函数的效果,结果一致:

CRC-8校验函数8位计算方式优化

在理解了和CRC8校验原理完全一致的代码实现后,不采用64位计算方式,则可以简化代码为8位计算方式,可得到相同的校验值结果:

#include <stdio.h>
#include <stdlib.h>
uint8_t PY_CRC_8_S(uint8_t *di, uint32_t len)
{uint8_t crc_poly = 0x07; //X^8+X^2+X^1+1 total 8 effective bits without X^8. Computed total data shall be compensated 8-bit '0' before CRC computing.uint32_t clen = len+1;uint8_t cdata[clen] ;memcpy(cdata, di, len); cdata[len]=0;uint8_t data_t = cdata[0]; //CRC registerfor (uint32_t i = 1; i < clen; i++){for (uint8_t j = 0; j <= 7; j++){if(data_t&0x80)data_t = ( (data_t<<1) | ( (cdata[i]>>(7-j))&0x01) ) ^ crc_poly;elsedata_t = ( (data_t<<1) | ( (cdata[i]>>(7-j))&0x01) ) ;}}return data_t;
}

CRC-8校验函数查表原理优化

CRC查表原理通过输入数据分段计算(CRC-8按字节分段)原理实现校验码的计算,查表法有如下特点:

  1. 当前输入数据段值异或当前的查表值,得到当前的CRC计算余数
  2. 当前查表值由前一计算余数与校验码按CRC校验过程计算得到,并保存为对应前一计算余数对应的表位值
  3. 当前查表值的计算不受当前输入字段值影响,所以当前输入字段值为0且为最后字段时,当前查表值异或当前输入字段值不变,此时当前查表值即为CRC校验值结果。
  4. 由第2和3条可知,第2条在CRC校验过程计算时,移位补位时补0即可,也就不需要当前字段值进入移位补位过程。

CRC-8校验函数优化为如下代码,仍然是8位计算方式,特点是不需要对输入数据补8位尾0:

uint8_t PY_CRC_8_T(uint8_t *di, uint32_t len)
{uint8_t crc_poly = 0x07; //X^8+X^2+X^1+1 total 8 effective bits without X^8.uint8_t data_t = 0;while(len--){data_t ^=  *di++;for (int8_t i=8; i>0; --i){if (data_t & 0x80)data_t = (data_t<<1) ^ crc_poly;elsedata_t = (data_t<<1);}}return (data_t);
}

采用如上三种方式任何一种,对单字节0~255的输入数分别进行CRC-8校验,得到的各个校验值,也就得到查表法对应每个输入数值的查表值。

CRC-8校验注意事项

实际应用中,由于输入数据前处理和输出数据后处理的不同,产生了不同的CRC应用标准,其中一些是一些知名厂家为自己的产品定义CRC校验函数。这些处理特性包括CRC寄存器初始值设置,数据字节位反转,数据字节高位还是低位优先进入计算,输出的整个数据是否按位反转,输出数据是否和一个数异或等。常见的一些CRC-8校验特性:

–End–

C语言标准CRC-8校验函数相关推荐

  1. CRC校验原理及CRC-8简单校验函数设计

    CRC校验原理及CRC-8简单校验函数设计 CRC为循环冗余校验码,是一种常用的.具有检错.纠错能力的校验码.通常发送方在发送的数据之后,附上其CRC校验码.接收方收到数据后,也做同样的CRC校验,得 ...

  2. C语言CRC-16 IBM格式校验函数

    C语言CRC-16 IBM格式校验函数 CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性.基本的CRC-16校验算法实现,参考: C语言 ...

  3. CRC16 校验函数

    数据传输时经常会用到CRC16校验,所以这里记录一下CRC16 校验函数 crc16.h #ifndef _CRC16_H_ #define _CRC16_H_unsigned short CRC16 ...

  4. CRC冗余校验码源码代码c语言,循环冗余校验码(CRC)应用总结(包括C++源码)

    最近在实习期间需要用到数据的校验,所选为CRC16,那么就在此总结一番吧. 现在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用 ...

  5. php的数据校验,php 数据类型校验函数的简单示例

    这篇文章主要为大家详细介绍了php 数据类型校验函数的简单示例,具有一定的参考价值,可以用来参考一下. 对php中数据类型校验函数感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 通过这些 ...

  6. php 表单校验函数库(判断email格式是否正确、http地址是否合法有效、手机号码是否合法)...

    /*** 表单校验函数库*//*** 判断email格式是否正确* @param $email*/ function is_email($email) {return strlen($email) & ...

  7. sql判断邮箱是否合法_分享一个oracle身份证校验函数,判断你的身份证是否合法...

    概述 有个朋友说能不能用函数来实现对身份证的校验,所以这里用Oracle的函数来实现,其他数据库异曲同工.. 身份证校验函数 CREATE OR REPLACE FUNCTION Func_check ...

  8. 校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

  9. C# 串口CRC CCITT-FALSE 校验

    串口CRC CCITT-FALSE 校验 public static bool CRC16_CCITT_FALSE(byte[] byteData) //C# crc-16/CCITT-FALSE,带 ...

最新文章

  1. redis入门(03)redis的配置
  2. python3 读取txt替换、n_从Python2迁移到Python3实战(一) pyupgrade
  3. ZYNQ EMIO使用及可重用封装
  4. Linux/windows下nginx的安装及使用
  5. kaggle比赛模型融合指南
  6. Dollar Dayz POJ - 3181
  7. php进程间通信 yoc_续上篇Swoole多进程数据共享的问题
  8. Linux内核深入理解定时器和时间管理(4):定时器 timer
  9. SpringCloud之Zuul网关
  10. cocos2d-x-2.2.1环境搭建
  11. ap启动失败 ensp_华为ENSP模拟无线AP配置
  12. python 实现软件激活码验证
  13. python数据挖掘14讲_python/pandas数据挖掘(十四)-groupby,聚合,分组级运算
  14. 又让马儿跑又不让吃草,微服务化如何完成低成本改造?
  15. 下载陷阱:软件带着病毒来
  16. 番外篇:STM32之GPIO口速率配置究竟代表什么
  17. Android 平台电容式触摸屏硬件基本原理
  18. ios9 网络请求出错The resource could not be loaded becaus
  19. 传智播客php电商项目源码,shop thinkphp写的电子商城代码,原 为传智播客的教学 源码 WEB(ASP,PHP,...) 256万源代码下载- www.pudn.com...
  20. 易语言超级列表框使用

热门文章

  1. Google Earth Engine ——时间序列分析(MODIS数据分析海上漏油事件)1.5万字
  2. 计算机科学与技术同等学力申硕考试复习方法--数学部分
  3. 华为harmonyos认证,统一品牌、统一体验、统一方案、统一平台!厉害了华为HarmonyOS...
  4. 友益文书软件加密深度分析
  5. ES8.0(Elasticsearch)启动成功,访问失败
  6. 难道要让中国世代的人都去充当廉价的劳动力吗?
  7. 量化投资 第27章 K线图 27.1
  8. android 悬浮按钮 功能实现,android悬浮按钮实现方法
  9. vue+qrcodejs2 动态生成二维码并下载
  10. 新零售业背景下零售业实体店的经营战略