C语言CRC-8 ITU格式校验函数

news2024/9/20 6:29:28

C语言CRC-8 ITU格式校验函数

CRC校验基于前处理和后处理的不同,由不同的协会标准推出了一些不同格式的版本。这里介绍CRC-8 ITU格式的校验函数。

CRC-8 ITU格式特征

标准CRC-8的校验函数参考: C语言标准CRC-8校验函数
CRC-8 ITU格式和标准CRC-8校验算法比较,增加了输出数据异或0x55的后处理,因此在标准CRC-8校验函数上增加此部分即可实现CRC-8 ITU格式校验函数。

CRC-8 ITU校验函数正向算法

正向算法是符合标准CRC-8的计算理论,从左向右计算,也即计算过程中移位时,向左移出。几种正向算法的实现如下:

CRC-8 ITU格式校验函数一(8位输入数据格式,64位装载计算):

#include <stdio.h>
#include <stdlib.h>
uint8_t PY_CRC_8_ITU(uint8_t *di, uint32_t len)
{   //Written by Pegasus Yu 2022/04/22
	uint16_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 data
	uint16_t data_t = 0; //Process data of CRC computing

	uint16_t index_t = 63;  ///bit shifting index for initial '1' searching
	uint16_t index = 63;    //bit shifting index for CRC computing
	uint8_t rec = 0; //bit number needed to be compensated for next CRC computing

	uint32_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 data

     if(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;
    		 cn++;
    	 }
    	 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) //next segment
 		{
  			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' searching
 	 		index = 63;    //bit shifting index for CRC computing
 	 		rec = 0; //bit number needed to be compensated for next CRC computing
 		}

     }
     while(cn>0);

     free(datain);
     return (uint8_t)(data_t ^ 0x55);
}

CRC-8 ITU格式校验函数二(8位输入数据格式):

#include <stdio.h>
#include <stdlib.h>
uint8_t PY_CRC_8_S_ITU(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 register

    for (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;
            else
            	data_t = ( (data_t<<1) | ( (cdata[i]>>(7-j))&0x01) ) ;
        }
    }
    return (data_t ^ 0x55);
}

CRC-8 ITU格式校验函数三(8位输入数据格式):

uint8_t PY_CRC_8_T_ITU(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;
            else
            	data_t = (data_t<<1);
        }
    }

    return (data_t ^ 0x55);
}

算法验证

3种算法结果相同:

在这里插入图片描述

通过在线CRC工具对照验证成功:
在这里插入图片描述

–End–

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis是什么?Mybatis入门程序

一、框架是什么&#xff1f; 1.java常见框架&#xff1a; SSM三大框架&#xff1a;SpringMybatisSpringMvc 2.什么是框架&#xff1f; 框架本身就是对于通用代码的封装,提前写好的类和方法&#xff0c;我们在做项目的时候直接引入这些框架(本质就是引入类…

Matlab 最远点采样(FPS,二维版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 简而言之,该方法是通过迭代、增量的方式来选择距离前一个点集最远的点从而实现数据的采样过程。其算法步骤如下所述: (1)从点集 S S S中随机选择一个点

【Linux基本指令和权限(1)】

本文思维导图&#xff1a; 文章目录 一、Linux操作的特点二、使用指令从Xhell登录云服务器三、基本指令1.ls指令2. pwd指令&#xff1a;3.cd指令4. touch指令5. rm指令 写在最后 Linux是一个操作系统&#xff0c;操作系统是一款做软硬件管理的软件。 一、Linux操作的特点 Li…

报错解决:关于swagger的Caused by: java.lang.NullPointerException: null

目录 一、遇到问题 二、解决办法 方法一 方法二 方法二中导入依赖报错的解决方案 一、遇到问题 在往springboot项目里面添加swagger时候&#xff0c;启动的时候就报了如下null了的错误 遇到问题的报错提示&#xff1a; Error starting ApplicationContext. To display the…

200人 500人 园区网设计

实验要求&#xff1a; ① 设置合理的STP优先级、边缘端口、Eth-trunk ② 企业内网划分多个vlan &#xff0c;减少广播域大小&#xff0c;提高网络稳定性 ③ 所有设备&#xff0c;在任何位置都可以telnet远程管理 ④ 出口配置NAT ⑤ 所有用户均为自动获取ip地址 ⑥ 在企业…

bitset(位图)的使用与模拟实现

bitset&#xff08;位图&#xff09; 位图引入bitset的使用bitset&#xff08;位图&#xff09;的模拟实现bitset类各函数接口总览bitset类的实现构造函数set、reset、flip、testsize、countany、none、all打印函数 位图引入 问&#xff1a;给40亿个不重复的无符号整数&#xf…

Cell Reports:任栓成/高东/胡志安/唐玲团队合作揭示压力性失眠发生的神经机制

良好的觉醒与睡眠是幸福生活和高效工作的前提。然而&#xff0c;随着现代社会生活节奏的加快&#xff0c;觉醒睡眠障碍&#xff0c;特别是失眠&#xff0c;已成为不容忽视的健康问题。据中国睡眠研究会发布的《2022中国国民健康睡眠白皮书》显示&#xff0c;约3/4人群曾存在觉醒…

Tpflow V7.0.2 PHP 工作流引擎新版发布

欢迎使用 Tpflow V7.0.1 工作流引擎 TpFlow 工作流引擎是一套规范化的流程管理系统&#xff0c;基于业务而驱动系统生命力的一套引擎。彻底释放整个信息管理系统的的活力&#xff0c;让系统更具可用性&#xff0c;智能应用型&#xff0c;便捷设计性。Tpflow 团队致力于打造中国…

如何提高企业运转效率?

企业运转效率是企业成功的重要因素之一&#xff0c;随着市场竞争的加剧和客户需求的不断提高&#xff0c;企业需要不断提高运转效率以保持竞争力。本文将从提高企业运转效率的意义、影响因素、优化方法等方面进行探讨。 提高企业运转效率的意义 提高企业运转效率的意义主要包…

提高Web应用程序稳定性的关键:如何编写高质量的Web自动化测试用例

目录 设计测试用例 编写测试用例 安装Selenium和Python库 编写测试用例 执行测试用例 创建测试套件 运行测试用例 分析测试结果 总结 Web自动化测试用例的编写是Web应用程序测试中非常重要的一环。它可以确保Web应用程序在不同条件和场景下的稳定性、可靠性和正确性。…

合合信息新推出反光消除技术,助力手写文字识别更精准

近期&#xff0c;合合信息旗下扫描全能王推出液晶手写板&#xff08;简称“手写板”&#xff09;&#xff0c;为用户带来仿真、流畅的书写绘画体验&#xff0c;一同发布的还有扫描全能王APP的新功能“拍手写板”。该功能可帮助用户在拍摄手写板内容后去除图片上的反光干扰&…

Tuxera NTFS2023第三方应用苹果电脑磁盘读写工具

哪里有专业级的NTFS格式读写工具&#xff1f;Tuxera NTFS2023中文版是一款非常好用的NTFS读写工具&#xff0c;可以让您完整的读写兼容NTFS格式驱动器&#xff0c;对磁盘进行访问、编辑、存储和传输文件等操作。同时还包括开源磁盘管理器等简单的格式和硬盘维修检查和修复。Mac…

即时通讯APP开发方案?你想要的全在这里!

现如今的即时通讯需求其实很多&#xff0c;应用场景也是多样化&#xff1b;企业内部办公、社交聊天、朋友闲聊都可以在即时通讯APP内完成。 即时通讯app开发对于企业来说是内部沟通的重要模式&#xff0c;对于普通用户来说这种交通方式也更加灵活化&#xff1b;即时通讯app开发…

酒店预订小程序开发:如何通过小程序提升您的酒店品牌价值?

在当今高度数字化的世界里&#xff0c;通过酒店小程序开发来提升品牌价值已成为一种越来越流行的方式。酒店小程序源码的开发可以帮助酒店提供更好的客户体验&#xff0c;提高预订转化率。在本文中&#xff0c;我们将探讨如何通过酒店小程序开发来提升您的酒店品牌价值。 酒店…

记录-因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 背景 最近在项目中要实现一个拖拽头像的移动效果&#xff0c;一直对JS Dom拖拽这一块不太熟悉&#xff0c;甚至在网上找一个示例&#xff0c;都看得云里雾里的&#xff0c;发现遇到最大的拦路虎就是JS…

GNSS/INS组合导航实习面试

GNSS/INS组合导航面试 美团无人机、云创智行、阿里达摩院、图森蔚来组合导航、来牟创新、 腾讯地图出行事业部、 持续更新 文章目录 GNSS/INS组合导航面试1.GNSS方面的问题模糊度固定的方法&#xff0c;以及部分模糊度固定多普勒和载波为什么精度更高&#xff0c;对多径更不敏…

你们工作中怎么用ChatGPT?如何高效Prompt?

当你还在错误使用对话 AI 工具如 GPT&#xff0c;可能会觉得其作用不过是知识平移总结或简单问答。实际上&#xff0c;当了解先进的用法、知悉如何做到 better prompt&#xff0c;你会发现&#xff1a;AI 不是来替代你的&#xff0c;是来帮助你更好工作。如果还用搜索引擎的“关…

【iOS-分类,拓展和关联对象底层探究】

前言 寒假分享会问题解决二 早在大一的OC的学习过程就知道了分类和拓展的区别和联系&#xff0c;分类不能添加成员变量&#xff0c;而拓展可以添加成员变量。分类是在运行时期实现的&#xff0c;而拓展只是编译器的时候就实现了。对于分类我们可以通过关联对象来为我们需要的分…

什么蓝牙耳机好?经销商分享线下热销蓝牙耳机品牌排行

开实体店铺多年&#xff0c;对数码行业多有研究&#xff0c;每天都会试用各种数码产品。网友们在发帖咨询什么蓝牙耳机好&#xff0c;为此我整理了实体店铺最受欢迎的蓝牙耳机品牌排行&#xff0c;大家在选购时可以作为备选&#xff1a; 第一款&#xff1a;JEET Air2蓝牙耳机 …

Mac M1/M2 安装nvm管理多版本node

Mac M1/M2 安装nvm管理多版本node Mac m1、Mac&#xff0c;Ventura 13.2&#xff0c;M2安装NVM使用homebrew安装nvm安装NodeMac nvm install failed python: not found解决方法(终端中执行以下命令)&#xff1a; Mac m1、Mac&#xff0c;Ventura 13.2&#xff0c;M2安装NVM 使…