使用半字节查表法之CRC16的code sample.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用半字节查表法之CRC16的code sample 在进行通讯的过程中, 我们需要和CRC打交道. Allen觉得, 尽管在很多时候, CRC并不是那么重要. 但是出于通讯协议兼容, 我们往往被迫使用CRC计算. 在通宵的工作过程中, Allen 对网络资源进行了一番整理, 并自行加入理解, 便于同行们, 在相应工作时, 节省大量查阅资料的时间. 前提: 1. 运算法则的可靠性: 在反复检索资料后, Allen 意识到, 弄清运算法则需要至少1个工作日, 用大量实例和思考, 并配合相当的实例进行思考. 在极大的项目时间压力下, 我们放弃这个know-why 的行为. 我们接受现有算法, 作为定理的引用, 而非作为一个严谨算数逻辑推导的结果. CRC要素: 1. 多项式除法 在进行 CRC 计算之前, 我们不得不重温多项式除法. 检索: /chi/ppt/ch03/lecture03_02c.ppt 的 ppt 文档. 大致我们知道: 多项式除以单项式时, 我们可以使用分配率. 而多项式除以多项式时, 我们必须使用长除法. 2. CRC原理 简单描述: 把待传送的数据 M 的二进制码序列看成多项式 M, 事先选定一个 r+1 bit 的二进制数看成多项式 P, 把多项式 M 除以 P, 得到商Q 和余数 R(r bit), 把余数 R 附加在信息码 M 一起发送. 在接收端, 使用同样的 M/P 获取余数 R, 与 R 比较验证 M 是否正确. 引用讨论: /u09/d3121402-443c-4d6d-be2d-6746f9434c72.html 举例说明: 信息位: 1011001 CRC码: 4位 r = 4 校验多项式(生成码): 11001 (x4+x3+1) 运算步骤: 1011001 - 左移4位 - 10110010000 - 除以 11001 - 遵守运算法则: 不借位除法, 即异或运算, 得到结果(余数) 1010, 即为 CRC 码. 3. 例程实现: CRC的算法包括: 基本算法, 字节查表法, 半字节查表法 我们主要讨论 16 bit 的 CRC 实现, 使用 CRC16-CCITT, 也即是 X16+X12+X5+1, 生成码为 0x1021. 本来实际值应该是 0x010121, 这里又引入了一个运算法则: 最高位一定为1故抛弃, 因此是 0x1021. 3.1 基本算法: /downloads90/sourcecode/embed/341559/crc.c__.htm /**************************************************************** *函数性质:公共 *入口:要进行CRC校验的数据缓冲unsigned char *ptr,要进行CRC校验的数据长度 *出口:CRC计算结果 *功能:CRC16计算(计算速度慢,程序空间小) *调用方式:unsigned short CalCRC16Slow(unsigned char *ptr, unsigned char len) *****************************************************************/ #if CRC16 == CRC16SLOW unsigned short CalCRC16Slow(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned short crc = 0; while(len--!=0) { for(i = 0x80; i != 0; i/=2) { if((crc0x8000)!=0) { crc^=0x1021; } /* 余式CRC乘以2再求CRC */ else crc*=2; if((*ptri)!=0) crc^=0x1021; /* 再加上本位的CRC */ } ptr++; } return(crc); } #endif

文档评论(0)

zhuliyan1314 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档