CCITTCRC-16计算原理与实现

上传人:工**** 文档编号:471366367 上传时间:2023-06-10 格式:DOC 页数:7 大小:64KB
返回 下载 相关 举报
CCITTCRC-16计算原理与实现_第1页
第1页 / 共7页
CCITTCRC-16计算原理与实现_第2页
第2页 / 共7页
CCITTCRC-16计算原理与实现_第3页
第3页 / 共7页
CCITTCRC-16计算原理与实现_第4页
第4页 / 共7页
CCITTCRC-16计算原理与实现_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《CCITTCRC-16计算原理与实现》由会员分享,可在线阅读,更多相关《CCITTCRC-16计算原理与实现(7页珍藏版)》请在金锄头文库上搜索。

1、wordCCITT CRC-16计算原理与实现 + message1; for (i = 0; i len; i+) if (i len - 2) for (j = 0; j = 7; j+) if (short)crc_reg 0) crc_reg = (crc_reg (7 - i) 0x1021; else crc_reg = (crc_reg (7 - i); else for (j = 0; j = 7; j+) if (short)crc_reg 0) crc_reg = (crc_reg 1) 0x1021; else crc_reg = 1; return crc_reg; 显

2、然,每次内循环的行为取决于存放器首位。由于异或运算满足交换率和结合律,以与与0异或无影响,消息可以不移入存放器,而在每次内循环的时候,存放器首位再与对应的消息位异或。改良的代码如下: unsigned short do_crc(unsigned char *message, unsigned int len) int i, j; unsigned short crc_reg = 0; unsigned short current; for (i = 0; i len; i+) current = messagei 8; for (j = 0; j 8; j+) if (short)(crc_r

3、eg current) 0) crc_reg = (crc_reg 1) 0x1021; else crc_reg = 1; current = 1; return crc_reg; 以上的讨论中,消息的每个字节都是先传输MSB,CRC16-CCITT标准却是按照先传输LSB,消息右移进存放器来计算的。只需将代码改成判断存放器的LSB,将0x1021按位颠倒后(0x8408)与存放器异或即可,如下所示: Java代码 1. unsignedshortdo_crc(unsignedchar*message,unsignedintlen) 2. 3. inti,j; 4. unsignedshor

4、tcrc_reg=0; 5. unsignedshortcurrent; 6. 7. for(i=0;ilen;i+) 8. 9. current=messagei; 10. for(j=0;j1)0x8408; 14. else 15. crc_reg=1; 16. current=1; 17. 18. 19. returncrc_reg; 20. unsigned short do_crc(unsigned char *message, unsigned int len) int i, j; unsigned short crc_reg = 0; unsigned short curren

5、t; for (i = 0; i len; i+) current = messagei; for (j = 0; j 1) 0x8408; else crc_reg = 1; current = 1; return crc_reg; 该算法使用了两层循环,对消息逐位进展处理,这样效率是很低的。为了提高时间效率,通常的思想是以空间换时间。考虑到内循环只与当前的消息字节和crc_reg的低字节有关,对该算法做以下等效转换: Java代码 1. unsignedshortdo_crc(unsignedchar*message,unsignedintlen) 2. 3. inti,j; 4. uns

6、ignedshortcrc_reg=0; 5. unsignedcharindex; 6. unsignedshortto_xor; 7. 8. for(i=0;ilen;i+) 9. 10. index=(crc_regmessagei)&0xff; 11. to_xor=index; 12. for(j=0;j1)0x8408; 16. else 17. to_xor=1; 18. 19. crc_reg=(crc_reg8)to_xor; 20. 21. returncrc_reg; 22. unsigned short do_crc(unsigned char *message, un

7、signed int len) int i, j; unsigned short crc_reg = 0; unsigned char index; unsigned short to_xor; for (i = 0; i len; i+) index = (crc_reg messagei) & 0xff; to_xor = index; for (j = 0; j 1) 0x8408; else to_xor = 1; crc_reg = (crc_reg 8) to_xor; return crc_reg; 现在内循环只与index相关了,可以事先以数组形式生成一个表crc16_ccit

8、t_table,使得to_xor = crc16_ccitt_tableindex,于是可以简化为: Java代码 1. unsignedshortdo_crc(unsignedchar*message,unsignedintlen) 2. 3. unsignedshortcrc_reg=0; 4. 5. while(len-) 6. crc_reg=(crc_reg8)crc16_ccitt_table(crc_reg*message+)&0xff; 7. 8. returncrc_reg; 9. unsigned short do_crc(unsigned char *message, u

9、nsigned int len) unsigned short crc_reg = 0; while (len-) crc_reg = (crc_reg 8) crc16_ccitt_table(crc_reg *message+) & 0xff; return crc_reg; crc16_ccitt_table通过以下代码生成: Java代码 1. intmain() 2. 3. unsignedcharindex=0; 4. unsignedshortto_xor; 5. inti; 6. 7. printf(unsignedshortcrc16_ccitt_table256=n); 8. while(1) 9. 10. if(!(index%8) 11. printf(n); 12. 13. to_xor=index; 14. for(i=0;i8;i+) 1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号