技术标签: 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
From: http://www.w3school.com.cn/sql/sql_isnull.aspSQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数请看下面的 "Products" 表:P_IdProductNameUnitPriceUnitsInStockUnitsOnOrder1computer69925152printer365...
UBUNTU12.04 下测试成功安装lshkit包的过程是简单的,重点是在安装这个包之前要安装别的包。安装过程在下载的lshkit包中的include/lshkit.h文件中有介绍。所需包:cmake,gsl(gnu scientific library),boost library一、安装cmake 1、下载cmake的source包(http://ww
用Ubuntu的apt包管理工具安装的mysql数据库,默认将数据库文件保存在/var/lib/mysql目录下,时间久了数据库越来越大,所以准备挂载个新的硬盘专门存放mysql数据库。1、确定mysql数据库文件存放目录一般默认是在/var/lib/mysql目录下。先登录自己的mysql数据库,比如我用root账户登录,然后使用下面查询语句查询:show variables like '%di..._mysql数据库从linux服务器迁移至ubuntu上
要澄清的是,互斥手段的选择,不是根据临界区的大小,而是根据临界区的性质,以及有哪些部分的代码,即哪些内核执行路径来争夺。从严格意义上说,semaphore和spinlock_XXX属于不同层次的互斥手段,前者的实现有赖于后者,这有点象HTTP和TCP的关系,都是协议,但层次是不同的。先说semaphore,它是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但_类似 spinlock
带入gRPC:对 RPC 方法做自定义认证原文地址:带入gRPC:对 RPC 方法做自定义认证项目地址:https://github.com/EDDYCJY/go...前言在前面的章节中,我们介绍了两种(证书算一种)可全局认证的方法:TLS 证书认证基于 CA 的 TLS 证书认证Unary and Stream inter...
作为 Java 程序员,无论是技术面试、项目研发或者是学习框架源码,不彻底掌握 Java 多线程的知识,做不到心中有数,干啥都没底气,尤其是技术深究时往往略显发憷。坐稳扶好,通过今天的分...
呵呵,一年前的这个时候发过一系列讨论网络游戏同步的帖子。一年后的今天,再重新讨论讨论这个问题。。。不知道大家是否碰到过这种情况,当某个玩家发出一个火球,这个火球有自己的运动轨迹,那么如何来判断火球是否打中了人呢?大部分情况,当策划提出这个要求的时候,一般会被程序否认,原因是:太麻烦了,呵呵。复杂点的还有包括两个火球相撞之类的事情发生。那么网络游戏中,是否真的无法模拟实现这种模拟呢?首先
目的:handle的出现主要是为了解决线程间通讯。 举个例子,android是不允许在主线程中访问网络,因为这样会阻塞主线程,影响性能,所以访问网络都是放在子线程中执行,对于网络返回的结果则需要显示在主线程中,handler就是连接主线程和子线程的桥梁。1.handler基本使用方法 看一下使用方法: public static final int EM..._looper 不停从messagequeue取出message为什么不卡死
1. 计算机数据管理技术的发展包括三个阶段:人工管理阶段、文件系统阶段、数据库系统阶段2. E-R图是E-R模型的图形表示法,它是表示概念数据模型的有力工具,包括三个基本概念,即实体、联系、属性。关系模型中实体之间联系有三种关系:一对一关系,一对多关系,多对多关系3. 数据库中的数据按一定的数据模型组织、描述、存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可以供各种用户共享4. 目前主流的...
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 分)为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。输入格式:输入在一行中给出某用户的月用电量(单位:千瓦时)。输出格式:在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Val