中学教育网Rss 2.0中学教育网手机WAP浏览支持
首页 新闻 论文 课件 教学设计 试题 工具 辅导资料 电脑教程 新课标 高三复习 物理奥赛 人教版
论坛 悦读 课程改革 教学随笔 教学心得 初中试题 高中试题 文言文 说课 应用文萃 07高考 浙教版
图片 商城 初中教案 高中教案 中考作文 高考作文 诗歌散文  状元题库 化学竞赛 06高考 06中考试题
您现在的位置: 中学教育网 >> 教学论文 >> 其他论文 >> 信息技术 >> 文章正文 用户登录 新用户注册
CRC校验实用程序库论文 教育资料下载
作者:中学教育    文章来源:中学教育    点击数:    更新时间:2007-8-18
发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】【字体: 】【论坛

 点击登录中学教育论坛



关键字:CRC校验实用程序库论文 教育资料下载

   在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

  CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式如表1所示。

  @@10A08800.GIF;表1.最常用的CRC码及生成多项式@@

  由于CRC在通讯和数据处理软件中经常采用,笔者在实际工作中对其算法进行了研究和比较,总结并编写了一个具有最高效率的CRC通用程序库。该程序采用查表法计算CRC,在速度上优于一般的直接模仿硬件的算法,可以应用于通讯和数据压缩程序。

  通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值反复更新而得到的。这样,求解CRC的速度较慢。通过对CRC算法的研究,我们发现:一个8位数据加到16位累加器中去,只有累加器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。本文所提供的程序库中,函数crchware是一般的16位CRC的算法;mk-crctbl用以在内存中建立一个CRC数值表;crcupdate用以查表并更新CRC累加器的值;crcrevhware和crcrevupdate是反序算法的两个函数;BuildCRCTable、CalculateBlockCRC32和UpdateCharac

  terCRC32用于CRC32的计算。

  /* CRC.C——CRC程序库 */

  #define CRCCCITT 0x1021

  #define CCITT-REV 0x8408

  #define CRC16 0x8005

  #define CRC16-REV 0xA001

  #define CRC32-POLYNOMIAL 0xEDB88320L

  /* 以上为CRC除数的定义 */

  #define NIL 0

  #define crcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];

  #define crcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff])

  /* 以上两个宏可以代替函数crcupdate和crcrevupdate */

  #include

  #include

  #include

  /* 函数crchware是传统的CRC算法,其返回值即CRC值 */

  unsigned short crchware(data,genpoly,accum)

  unsigned short data;/* 输入的数据 */

  unsigned short genpoly;/* CRC除数 */

  unsigned short accum;/* CRC累加器值 */

  {

  static int i;

  data<<=8;

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

  {

  if((data^accum)&0x8000)

  accum=(accum<<1)^genpoly;

  else

  accum<<=1;

  data<<=1;

  }

  return (accum);

  }

  /* 函数mk-crctbl利用函数crchware建立内存中的CRC数值表 */

  unsigned short *mk-crctbl(poly,crcfn);

  unsigned short poly;/* CRC除数--CRC生成多项式 */

  unsigned short (*crcfn)();/* 指向CRC函数(例如crchware)的指针 */

  {

  /* unsigned short */malloc(); */

  unsigned short *crctp;

  int i;

  if((crctp=(unsigned short*)malloc(256*sizeof(unsigned)))==0)

  return 0;

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

  crctp[i]=(*crcfn)(i,poly,0);

  return crctp;

  }

  /* 函数mk-crctbl的使用范例 */

  if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL)

  {

  puts("insuff memory for CRC lookup table.\n");

  return 1; */

  /* 函数crcupdate用以用查表法计算CRC值并更新CRC累加器值 */

  void crcupdate(data,accum,crctab)

  unsigned short data;/* 输入的数据 */

  unsigned short *accum;/* 指向CRC累加器的指针 */

  unsigned short *crctab;/* 指向内存中CRC表的指针 */

  {

  static short comb-val;

  comb-val=(*accum>>8)^data;

  *accum=(*accum<<8)^crctab[comb-val];

  }

  /* 函数crcrevhware是传统的CRC算法的反序算法,其返回值即CRC值 */

  unsigned short crcrevhware(data,genpoly,accum)

  unsigned short data;

  unsigned short genpoly;

  unsigned short accum;

  {

  static int i;

  data<<=1;

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

  {

  data>>=1;

  if((data^accum)&0x0001)

  accum=(accum>>1)^genpoly;

  else

  accum>>=1;

  }

  return accum;

  }

  /* 函数crcrevupdate用以用反序查表法计算CRC值并更新CRC累加器值 */

  void crcrevupdate(data,accum,crcrevtab)

  unsigned short data;

  unsigned short *accum;

  作者:周宁
  • 上一篇文章:
  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】【字体: 】【论坛
       中学教育网(ZhxEdu.com)依法保护知识产权,倡导网络文化,部分内容来自网络,如果我们的文章涉及您的有关权益,请与我们联系,请注明网址,我们会即时处理或删除,感谢您的合作!
       转载声明:如果您要转载中学教育网的文章,请载明出处“中学教育网”。   
     相关文章  最新文章
    LHARC中的动态限长编码压缩算法论文 教育资
    The Resource Reallocation Function of We
    Creation of Classical Haiku and Painting
    Published by the Corco论文 教育资料下载
    Kiss Your Children
     港校揽走广东252名尖子 希望再提高内地招生
     广东高招阳光工程 本科录取一分不照顾 图
     民间学者亮出首份完整框架的高考制度改革方
     第八届全国大运会在广东开幕:我国史上参赛人
     新生评价手册变身“个人博客”
     一周声音
     学生安全教育“短板”亟待“补长”
     受高考指挥棒影响 2年内缓解文理冷热不均
    特别推荐
    本站资源大部分来自互联网,若侵犯您的版权,请与站长(QQ:8757999)联系,我们会在第一时间里删除。鲁ICP备05008917号