在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(Cyclicl Redundncy Check英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。如果单纯模拟硬件实现方法,则计算速度较慢。笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。

首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。

组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。下面给出用C语言编制的计算程序。

首先将CRC生成多项式及CRC值表定义为一个头文件CRC.H:

#define CRC_CCITT 0x1021  //CCITT多项式

#define REV_CCITT 0x8408  //反转CCITT多项式

#define CRC16 0x8005      //CRC16多项式

#define REV_CRC16 0x

001  //反转CRC16多项式

unsigned short crc_tble[256]; //CRC值表

注:16位CCITT多项式(X16 +X12 +X5 +1)和16位CRC16多项式(X16 +X15 +X2+1)为两种最常用的CRC多项式。反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响CRC计算速度,故设反转多项式。

造表和查表法CRC计算函数。

#include "crc.h"

void mk_crctble(unsigned short genpoly)

unsigned short crc_tble[256];

unsigned short

ccnum=0;

unsigned short i,j,k;

for(i=0,k=0;i<256;i++,k++)

i<<=8;

for(j=8;j>0;j--)

if((i^ccnum)&0x8000)

ccnum=(

ccnum<<=1)^genpoly;

else

ccnum<<=1;

i<<=1;

crc_tble[k]=

ccnum;

void crc_upd

te(unsigned short d

t

,unsigned short

ccnum)

ccnum=(

ccnum<<=8)^crc_tble[(

ccnum>>8)^d

t];

注:genpoly为CRC多项式,

ccnum为累加器值(即为新的CRC值),d

t

为参与CRC计算的信息。

参考文献:

【1】顾慰文,《纠错码及其在计算机系统中的应用》,人民邮电出版社,1980。

【2】 J.P.Roth,W.G.Bouricius: Progrmmed lgorithms to compute tests

todetect nd nd distinguish between filures in logic circuits, IEEETrns.

Electron. Comput.,EC- 16,No.5,pp.567-580(1977)

【3】Joe Cmpell:C Progr mmer's Guide to Seril Communiction.(1988)

用c语言打电子算料,用C语言实现CRC校验计算相关推荐

  1. c语言坐标正算实验报告,C语言程序设计实验报告范文

    实验名称 计算出1000以内10个素数之和 实验目的 1.熟练掌握if.if-else.if-else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和swi ...

  2. CRC校验及C语言实现

    摘自:CRC校验原理及其C语言实现 地址:https://blog.csdn.net/whik1194/article/details/108837493?spm=1001.2014.3001.550 ...

  3. CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    文章目录 前言 一.CRC校验码的计算 1.CRC模型 2.CRC计算 步骤1:输入数据与初始值模2加并左移 步骤2:被除数与多项式模2除 二.CRC校验码生成逻辑的C语言实现 1.实现代码 2.代码 ...

  4. c语言电子日历程序,c语言程序设计电子日历

    c语言程序设计电子日历 目 录 一.设计思路 二.功能实现详细设计 三.测试结果分析 四.用户手册 五.设计体会 一.设计思路: If语句: 判断该年是否为闰年,判断一年是否为闰年需要符合下面二者之一 ...

  5. 脚本编程语言python语言-python算的上脚本语言吗

    脚本语言泛指单用作简单編程任务如shell scripts.脚本语言是一种介乎于 HTML 和诸如 JAVA . Visual Basic . C++ 等编程语言之间的一种特殊的语言,尽管它更接近后者 ...

  6. C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训

    C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训 功能演示: 版本介绍 滑动式 点击放大式 完整版 至尊版 获取方式 功能演示: 演示视频: 滑动式 点击放大式 版本介绍 分为滑动式.点击 ...

  7. 数字时钟程序c语言,C语言实现电子时钟程序

    本文实例为大家分享了C语言实现电子时钟程序的具体代码,供大家参考,具体内容如下 Qt 里面运行 #include #include #include #include #include typedef ...

  8. 电子科技20秋C语言在线作业3,【奥鹏】[电子科技大学]20秋《C语言》在线作业3...

    [奥鹏][电子科技大学]20秋<C语言>在线作业3 [奥鹏]-电子科技大学20秋C语言在线作业3试卷总分:100 得分:100第1题,下面程序是从键盘输入学号,然后输出学号中百位数字是3的 ...

  9. C语言与电子信息工程的关系,信息工程和电子信息工程区别

    信息工程主要指的是在信息方面的研究,而电子信息工程则偏硬件多一些,它的核心是在电子方面的研究.它们区别主要有三大类:一.主要课程不同:二.培养目标不同:三.培养要求不同. 一.主要课程不同 1.信息工 ...

最新文章

  1. php的闭包函数bingto_PHP 闭包那点事儿
  2. 用脑电波玩游戏,这款VR体验逆天了
  3. MPLS/×××分解:防止PE-CE的路由环路
  4. linux创建进程fork函数和vfork函数
  5. VTK:Rendering之Cone4
  6. Webpack —— tree-starking 解析
  7. MySQL:给表建立索引及索引的显示
  8. 地理空间数据Geometry在MySQL中使用(二)
  9. JS创建表单提交备份
  10. mysql 交叉表 存储过程_用于生成交叉表的存储过程的存储过程
  11. c语言烟花代码vc,C语言烟花程序
  12. 信息处理技术员下午考试试题分析
  13. 致远OA办公网“office控件不可用”及“无注册表类”解决办法
  14. C语言基础犄角旮旯的知识之数据类型
  15. 坑爹的360漏洞修补造成win7黑屏
  16. 快速学习-Ballot -- 一个简单的投票合约
  17. Laravel Scout 包在 Elasticsearch 中的使用记录
  18. Icpc 沈阳 Bitwise Exclusive-OR Sequence
  19. 【微服务|Sentinel】实时监控|RT|吞吐量|并发数|QPS
  20. sqlserver数据批量插入

热门文章

  1. bootstrap基础学习十一篇
  2. 老李分享:系统可用性评估
  3. Linux统计某文件夹下文件、文件夹的个数
  4. poj1220:高精度进制转换模板题
  5. 管理软件预警通知(Notification)功能的实现案例分析
  6. PYTHON -MYSQLDB安装遇到的问题和解决办法
  7. 【培训】 项目实训中遇到的问题 总结 跟解决方法
  8. Tomcat中出现“RFC 7230 and RFC 3986“错误的解决方法
  9. layer重复弹出(layui弹层同时存在多个)的解决方法
  10. 分享一款博客园皮肤及其解决方案