- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)