crc检验c语言实现程序,CRC校验方法,用C语言实现源代码-程序员宅基地

技术标签: crc检验c语言实现程序  

CRC校验

CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单。用了一天时间研究了CRC的C语言实现,理解和掌握了基本原理和C语言编程。结合自己的理解简单写下来。

1、CRC简介

CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。接收端根据同样的规则校验,以确定传送中是否出错。接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。2、计算整个k+r位的CRC码,若为0,则接收正确。

CRC码有多种检验位数,8位、16位、32位等,原理相同。16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(即乘以2的16次方后),除以一个多项式,最后所得到的余数就是CRC码。

求CRC码所采用的是模2运算法则,即多项式除法中采用不带借位的减法运算,运算等同于异或运算。这一点要仔细理解,是编程的基础。

CRC-16: (美国二进制同步系统中采用) G(X) = X16 + X15 + X2 + 1

CRC-CCITT: (由欧洲CCITT推荐) G(X) = X16 + X12 + X5 + 1

CRC-32: G(X) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1

2、按位计算CRC

采用CRC-CCITT多项式,多项式为0x11021,C语言编程时,参与计算为0x1021,这个地方得深入思考才能体会其中的奥妙,分享一下我的思路:当按位计算CRC时,例如计算二进制序列为1001 1010 1010 1111时,将二进制序列数左移16位,即为1001 1010 1010 1111 (0000 0000 0000 0000),实际上该二进制序列可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……

现在开始分析运算:

<1>对第一个二进制分序列求余数,竖式除法即为0x10000 ^ 0x11021运算,后面的0位保留;

<2>接着对第二个二进制分序列求余数,将第一步运算的余数*2后再和第二个二进制分序列一起对0x11021求余,这一步理解应该没什么问题。如果该分序列为0,无需计算。

<3>对其余的二进制序列求余与上面两步相同。

<4>计算到最后一位时即为整个二进制序列的余数,即为CRC校验码。

该计算方法相当于对每一位计算,运算过程很容易理解,所占内存少,缺点是一位一位计算比较耗时。

下面给出C语言实现方法:

复制代码 代码如下:

unsigned char test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};

unsigned char len = 16;

void main( void )

{

unsigned long t

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39708636/article/details/117040485

智能推荐

SQL Server -- SQL NULL值,ISNull(),Oracal NVL(),MYSQL IFNULL(),COALESCE()-程序员宅基地

From: http://www.w3school.com.cn/sql/sql_isnull.aspSQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数请看下面的 "Products" 表:P_IdProductNameUnitPriceUnitsInStockUnitsOnOrder1computer69925152printer365...

ubuntu下安装lshkit包-程序员宅基地

UBUNTU12.04 下测试成功安装lshkit包的过程是简单的,重点是在安装这个包之前要安装别的包。安装过程在下载的lshkit包中的include/lshkit.h文件中有介绍。所需包:cmake,gsl(gnu scientific library),boost library一、安装cmake 1、下载cmake的source包(http://ww

linux 迁移mysql目录_Ubuntu下迁移MySQL数据库文件目录-程序员宅基地

用Ubuntu的apt包管理工具安装的mysql数据库,默认将数据库文件保存在/var/lib/mysql目录下,时间久了数据库越来越大,所以准备挂载个新的硬盘专门存放mysql数据库。1、确定mysql数据库文件存放目录一般默认是在/var/lib/mysql目录下。先登录自己的mysql数据库,比如我用root账户登录,然后使用下面查询语句查询:show variables like '%di..._mysql数据库从linux服务器迁移至ubuntu上

各种spinlock形式及使用条件_类似 spinlock-程序员宅基地

要澄清的是,互斥手段的选择,不是根据临界区的大小,而是根据临界区的性质,以及有哪些部分的代码,即哪些内核执行路径来争夺。从严格意义上说,semaphore和spinlock_XXX属于不同层次的互斥手段,前者的实现有赖于后者,这有点象HTTP和TCP的关系,都是协议,但层次是不同的。先说semaphore,它是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但_类似 spinlock

带入gRPC:对 RPC 方法做自定义认证-程序员宅基地

带入gRPC:对 RPC 方法做自定义认证原文地址:带入gRPC:对 RPC 方法做自定义认证项目地址:https://github.com/EDDYCJY/go...前言在前面的章节中,我们介绍了两种(证书算一种)可全局认证的方法:TLS 证书认证基于 CA 的 TLS 证书认证Unary and Stream inter...

Java线程池深度揭秘-程序员宅基地

作为 Java 程序员,无论是技术面试、项目研发或者是学习框架源码,不彻底掌握 Java 多线程的知识,做不到心中有数,干啥都没底气,尤其是技术深究时往往略显发憷。坐稳扶好,通过今天的分...

随便推点

再谈网络游戏同步-程序员宅基地

呵呵,一年前的这个时候发过一系列讨论网络游戏同步的帖子。一年后的今天,再重新讨论讨论这个问题。。。不知道大家是否碰到过这种情况,当某个玩家发出一个火球,这个火球有自己的运动轨迹,那么如何来判断火球是否打中了人呢?大部分情况,当策划提出这个要求的时候,一般会被程序否认,原因是:太麻烦了,呵呵。复杂点的还有包括两个火球相撞之类的事情发生。那么网络游戏中,是否真的无法模拟实现这种模拟呢?首先

Handler,Looper,MessageQueue流程梳理-程序员宅基地

目的:handle的出现主要是为了解决线程间通讯。  举个例子,android是不允许在主线程中访问网络,因为这样会阻塞主线程,影响性能,所以访问网络都是放在子线程中执行,对于网络返回的结果则需要显示在主线程中,handler就是连接主线程和子线程的桥梁。1.handler基本使用方法  看一下使用方法: public static final int EM..._looper 不停从messagequeue取出message为什么不卡死

计算机数据管理阶段,计算机数据管理技术的发展包括三个阶段.docx_米凯勒 法比恩的博客-程序员宅基地

1. 计算机数据管理技术的发展包括三个阶段:人工管理阶段、文件系统阶段、数据库系统阶段2. E-R图是E-R模型的图形表示法,它是表示概念数据模型的有力工具,包括三个基本概念,即实体、联系、属性。关系模型中实体之间联系有三种关系:一对一关系,一对多关系,多对多关系3. 数据库中的数据按一定的数据模型组织、描述、存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可以供各种用户共享4. 目前主流的...

Self-supervised Augmentation Consistency for Adapting Semantic Segmentation_spatial prior_Stdleohao的博客-程序员宅基地

Self-supervised Augmentation Consistency for Adapting Semantic SegmentationAbstract目的pratical and highly accurate;实用并且高精度之前的方法adversarial objectives,networkensemblesstyle transfer我们的方法标准的数据增强 – photometric noise, flipping and scaling并且确保在这些图_spatial prior

有趣的自然语言处理资源集锦-程序员宅基地

最近需要从文本中抽取结构化信息,用到了很多github上的包,遂整理了一下,后续会不断更新。详见fighting41love/funNLP很多包非常有趣,值得收藏,满足大家的收集癖!如果觉得有用,请分享并star,谢谢!涉及内容包括:中英文敏感词、语言检测、中外手机/电话归属地/运营商查询、名字推断性别、手机号抽取、身份证抽取、邮箱抽取、中日文人名库、中文缩写库、拆字词典、词汇情感值、停用..._自然语言处理同义词库

习题2-2 阶梯电价(15分)__trickle的博客-程序员宅基地

习题2-2 阶梯电价 (15 分)为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。输入格式:输入在一行中给出某用户的月用电量(单位:千瓦时)。输出格式:在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Val