CRC校验V2.00A.pdf

上传人:罗晋 文档编号:8936517 上传时间:2021-01-26 格式:PDF 页数:13 大小:1.87MB
返回 下载 相关 举报
CRC校验V2.00A.pdf_第1页
第1页 / 共13页
CRC校验V2.00A.pdf_第2页
第2页 / 共13页
CRC校验V2.00A.pdf_第3页
第3页 / 共13页
CRC校验V2.00A.pdf_第4页
第4页 / 共13页
CRC校验V2.00A.pdf_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《CRC校验V2.00A.pdf》由会员分享,可在线阅读,更多相关《CRC校验V2.00A.pdf(13页珍藏版)》请在三一文库上搜索。

1、/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /xxxx 可以直接使用的 CRC 校验程序 xxxx /xxxx xxxx /xxxx 编写:秦庆章 xxxx /xxxx 2010-01-18 xxxx /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC16-1021 表 G(X) = X16+X12+X5+1 /xxxxx

2、xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx const unsigned short TABLE1021256= 0 x0000,0 x1021,0 x2042,0 x3063,0 x4084,0 x50A5,0 x60C6,0 x70E7, 0 x8108,0 x9129,0 xA14A,0 xB16B,0 xC18C,0 xD1AD,0 xE1CE,0 xF1EF, 0 x1231,0 x0210,0 x3273,0 x2252,0 x52B5,0 x4294,0 x72F7,0 x62D6, 0 x9339,0 x8318,

3、0 xB37B,0 xA35A,0 xD3BD,0 xC39C,0 xF3FF,0 xE3DE, 0 x2462,0 x3443,0 x0420,0 x1401,0 x64E6,0 x74C7,0 x44A4,0 x5485, 0 xA56A,0 xB54B,0 x8528,0 x9509,0 xE5EE,0 xF5CF,0 xC5AC,0 xD58D, 0 x3653,0 x2672,0 x1611,0 x0630,0 x76D7,0 x66F6,0 x5695,0 x46B4, 0 xB75B,0 xA77A,0 x9719,0 x8738,0 xF7DF,0 xE7FE,0 xD79D,

4、0 xC7BC, 0 x48C4,0 x58E5,0 x6886,0 x78A7,0 x0840,0 x1861,0 x2802,0 x3823, 0 xC9CC,0 xD9ED,0 xE98E,0 xF9AF,0 x8948,0 x9969,0 xA90A,0 xB92B, 0 x5AF5,0 x4AD4,0 x7AB7,0 x6A96,0 x1A71,0 x0A50,0 x3A33,0 x2A12, 0 xDBFD,0 xCBDC,0 xFBBF,0 xEB9E,0 x9B79,0 x8B58,0 xBB3B,0 xAB1A, 0 x6CA6,0 x7C87,0 x4CE4,0 x5CC5

5、,0 x2C22,0 x3C03,0 x0C60,0 x1C41, 0 xEDAE,0 xFD8F,0 xCDEC,0 xDDCD,0 xAD2A,0 xBD0B,0 x8D68,0 x9D49, 0 x7E97,0 x6EB6,0 x5ED5,0 x4EF4,0 x3E13,0 x2E32,0 x1E51,0 x0E70, 0 xFF9F,0 xEFBE,0 xDFDD,0 xCFFC,0 xBF1B,0 xAF3A,0 x9F59,0 x8F78, 0 x9188,0 x81A9,0 xB1CA,0 xA1EB,0 xD10C,0 xC12D,0 xF14E,0 xE16F, 0 x108

6、0,0 x00A1,0 x30C2,0 x20E3,0 x5004,0 x4025,0 x7046,0 x6067, 0 x83B9,0 x9398,0 xA3FB,0 xB3DA,0 xC33D,0 xD31C,0 xE37F,0 xF35E, 0 x02B1,0 x1290,0 x22F3,0 x32D2,0 x4235,0 x5214,0 x6277,0 x7256, 0 xB5EA,0 xA5CB,0 x95A8,0 x8589,0 xF56E,0 xE54F,0 xD52C,0 xC50D, 0 x34E2,0 x24C3,0 x14A0,0 x0481,0 x7466,0 x644

7、7,0 x5424,0 x4405, 0 xA7DB,0 xB7FA,0 x8799,0 x97B8,0 xE75F,0 xF77E,0 xC71D,0 xD73C, 0 x26D3,0 x36F2,0 x0691,0 x16B0,0 x6657,0 x7676,0 x4615,0 x5634, 0 xD94C,0 xC96D,0 xF90E,0 xE92F,0 x99C8,0 x89E9,0 xB98A,0 xA9AB, 0 x5844,0 x4865,0 x7806,0 x6827,0 x18C0,0 x08E1,0 x3882,0 x28A3, 0 xCB7D,0 xDB5C,0 xEB

8、3F,0 xFB1E,0 x8BF9,0 x9BD8,0 xABBB,0 xBB9A, 0 x4A75,0 x5A54,0 x6A37,0 x7A16,0 x0AF1,0 x1AD0,0 x2AB3,0 x3A92, 0 xFD2E,0 xED0F,0 xDD6C,0 xCD4D,0 xBDAA,0 xAD8B,0 x9DE8,0 x8DC9, 0 x7C26,0 x6C07,0 x5C64,0 x4C45,0 x3CA2,0 x2C83,0 x1CE0,0 x0CC1, 0 xEF1F,0 xFF3E,0 xCF5D,0 xDF7C,0 xAF9B,0 xBFBA,0 x8FD9,0 x9F

9、F8, 0 x6E17,0 x7E36,0 x4E55,0 x5E74,0 x2E93,0 x3EB2,0 x0ED1,0 x1EF0, ; /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC16 校验(1021) /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx unsigned short CRC1021(const unsigned char *dat, unsigned char len) unsigned int CRC=0 x00;

10、unsigned char nHi; while(len) nHi = (unsigned char)(CRC8);/ 暂存 CRC 当前结果的高 8 位数据 CRC = 0 x08; / 左移 8 位,相当于 CRC 的低 8 位乘以高 8 位与 CRC = TABLE1021nHi*dat; / 数据异或后再查表 CRC,再异或以前的 CRC dat += 0 x01; / 移动到下一个字节数据 len -= 0 x01; return CRC; /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC8-107 表

11、 - CDT /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx const unsigned char TABLE107256= 0 x00,0 x07,0 x0E,0 x09,0 x1C,0 x1B,0 x12,0 x15,0 x38,0 x3F,0 x36,0 x31,0 x24,0 x23,0 x2A,0 x2D, 0 x70,0 x77,0 x7E,0 x79,0 x6C,0 x6B,0 x62,0 x65,0 x48,0 x4F,0 x46,0 x41,0 x54,0 x53,0 x5A,0 x5D, 0 xE0,

12、0 xE7,0 xEE,0 xE9,0 xFC,0 xFB,0 xF2,0 xF5,0 xD8,0 xDF,0 xD6,0 xD1,0 xC4,0 xC3,0 xCA,0 xCD, 0 x90,0 x97,0 x9E,0 x99,0 x8C,0 x8B,0 x82,0 x85,0 xA8,0 xAF,0 xA6,0 xA1,0 xB4,0 xB3,0 xBA,0 xBD, 0 xC7,0 xC0,0 xC9,0 xCE,0 xDB,0 xDC,0 xD5,0 xD2,0 xFF,0 xF8,0 xF1,0 xF6,0 xE3,0 xE4,0 xED,0 xEA, 0 xB7,0 xB0,0 x

13、B9,0 xBE,0 xAB,0 xAC,0 xA5,0 xA2,0 x8F,0 x88,0 x81,0 x86,0 x93,0 x94,0 x9D,0 x9A, 0 x27,0 x20,0 x29,0 x2E,0 x3B,0 x3C,0 x35,0 x32,0 x1F,0 x18,0 x11,0 x16,0 x03,0 x04,0 x0D,0 x0A, 0 x57,0 x50,0 x59,0 x5E,0 x4B,0 x4C,0 x45,0 x42,0 x6F,0 x68,0 x61,0 x66,0 x73,0 x74,0 x7D,0 x7A, 0 x89,0 x8E,0 x87,0 x80,

14、0 x95,0 x92,0 x9B,0 x9C,0 xB1,0 xB6,0 xBF,0 xB8,0 xAD,0 xAA,0 xA3,0 xA4, 0 xF9,0 xFE,0 xF7,0 xF0,0 xE5,0 xE2,0 xEB,0 xEC,0 xC1,0 xC6,0 xCF,0 xC8,0 xDD,0 xDA,0 xD3,0 xD4, 0 x69,0 x6E,0 x67,0 x60,0 x75,0 x72,0 x7B,0 x7C,0 x51,0 x56,0 x5F,0 x58,0 x4D,0 x4A,0 x43,0 x44, 0 x19,0 x1E,0 x17,0 x10,0 x05,0 x

15、02,0 x0B,0 x0C,0 x21,0 x26,0 x2F,0 x28,0 x3D,0 x3A,0 x33,0 x34, 0 x4E,0 x49,0 x40,0 x47,0 x52,0 x55,0 x5C,0 x5B,0 x76,0 x71,0 x78,0 x7F,0 x6A,0 x6D,0 x64,0 x63, 0 x3E,0 x39,0 x30,0 x37,0 x22,0 x25,0 x2C,0 x2B,0 x06,0 x01,0 x08,0 x0F,0 x1A,0 x1D,0 x14,0 x13, 0 xAE,0 xA9,0 xA0,0 xA7,0 xB2,0 xB5,0 xBC,

16、0 xBB,0 x96,0 x91,0 x98,0 x9F,0 x8A,0 x8D,0 x84,0 x83, 0 xDE,0 xD9,0 xD0,0 xD7,0 xC2,0 xC5,0 xCC,0 xCB,0 xE6,0 xE1,0 xE8,0 xEF,0 xFA,0 xFD,0 xF4,0 xF3, ; /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC8-107 校验 /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx unsigned cha

17、r CRC107(const unsigned char *RxBuf, unsigned char Len) unsigned char CRC_SUM=0 x00; while(Len-) CRC_SUM = TABLE107CRC_SUM(*RxBuf+); return CRC_SUM; /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC16 检验表高 - MODBUS /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx const uns

18、igned char MBCRC_Hi = 0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,

19、0 x80,0 x41, 0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x

20、40, 0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x00

21、,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, 0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x00,0 xC1,0

22、x81,0 x40,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40,0 x00,0 xC1,0 x81,0 x40,0 x01,0 xC0,0 x80,0 x41, 0 x00,0 xC1,0 x81,0 x40

23、,0 x01,0 xC0,0 x80,0 x41,0 x01,0 xC0,0 x80,0 x41,0 x00,0 xC1,0 x81,0 x40, ; /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC16 检验表低 - MODBUS /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx const unsigned char MBCRC_Lo = 0 x00,0 xC0,0 xC1,0 x01,0 xC3,0 x03,0 x02,0 xC2,0 x

24、C6,0 x06,0 x07,0 xC7,0 x05,0 xC5,0 xC4,0 x04, 0 xCC,0 x0C,0 x0D,0 xCD,0 x0F,0 xCF,0 xCE,0 x0E,0 x0A,0 xCA,0 xCB,0 x0B,0 xC9,0 x09,0 x08,0 xC8, 0 xD8,0 x18,0 x19,0 xD9,0 x1B,0 xDB,0 xDA,0 x1A,0 x1E,0 xDE,0 xDF,0 x1F,0 xDD,0 x1D,0 x1C,0 xDC, 0 x14,0 xD4,0 xD5,0 x15,0 xD7,0 x17,0 x16,0 xD6,0 xD2,0 x12,

25、0 x13,0 xD3,0 x11,0 xD1,0 xD0,0 x10, 0 xF0,0 x30,0 x31,0 xF1,0 x33,0 xF3,0 xF2,0 x32,0 x36,0 xF6,0 xF7,0 x37,0 xF5,0 x35,0 x34,0 xF4, 0 x3C,0 xFC,0 xFD,0 x3D,0 xFF,0 x3F,0 x3E,0 xFE,0 xFA,0 x3A,0 x3B,0 xFB,0 x39,0 xF9,0 xF8,0 x38, 0 x28,0 xE8,0 xE9,0 x29,0 xEB,0 x2B,0 x2A,0 xEA,0 xEE,0 x2E,0 x2F,0 x

26、EF,0 x2D,0 xED,0 xEC,0 x2C, 0 xE4,0 x24,0 x25,0 xE5,0 x27,0 xE7,0 xE6,0 x26,0 x22,0 xE2,0 xE3,0 x23,0 xE1,0 x21,0 x20,0 xE0, 0 xA0,0 x60,0 x61,0 xA1,0 x63,0 xA3,0 xA2,0 x62,0 x66,0 xA6,0 xA7,0 x67,0 xA5,0 x65,0 x64,0 xA4, 0 x6C,0 xAC,0 xAD,0 x6D,0 xAF,0 x6F,0 x6E,0 xAE,0 xAA,0 x6A,0 x6B,0 xAB,0 x69,

27、0 xA9,0 xA8,0 x68, 0 x78,0 xB8,0 xB9,0 x79,0 xBB,0 x7B,0 x7A,0 xBA,0 xBE,0 x7E,0 x7F,0 xBF,0 x7D,0 xBD,0 xBC,0 x7C, 0 xB4,0 x74,0 x75,0 xB5,0 x77,0 xB7,0 xB6,0 x76,0 x72,0 xB2,0 xB3,0 x73,0 xB1,0 x71,0 x70,0 xB0, 0 x50,0 x90,0 x91,0 x51,0 x93,0 x53,0 x52,0 x92,0 x96,0 x56,0 x57,0 x97,0 x55,0 x95,0 x

28、94,0 x54, 0 x9C,0 x5C,0 x5D,0 x9D,0 x5F,0 x9F,0 x9E,0 x5E,0 x5A,0 x9A,0 x9B,0 x5B,0 x99,0 x59,0 x58,0 x98, 0 x88,0 x48,0 x49,0 x89,0 x4B,0 x8B,0 x8A,0 x4A,0 x4E,0 x8E,0 x8F,0 x4F,0 x8D,0 x4D,0 x4C,0 x8C, 0 x44,0 x84,0 x85,0 x45,0 x87,0 x47,0 x46,0 x86,0 x82,0 x42,0 x43,0 x83,0 x41,0 x81,0 x80,0 x40,

29、 ; /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC16-MODBUS 产生的功能 /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx unsigned short CRC16(const unsigned char *puchMsg, unsigned short usDataLen) unsigned char uchCRCHi = 0 xFF; / 初始化高字节 unsigned char uchCRCLo = 0 xFF; / 初始化低

30、字节 unsigned int uIndex; / 把 CRC 表 while(usDataLen-) / 通过数据缓冲器 uIndex = uchCRCHi *puchMsg+;/ 计算 CRC uchCRCHi = uchCRCLo MBCRC_HiuIndex; uchCRCLo = MBCRC_LouIndex; return (uchCRCHi 8) | uchCRCLo); CRC 校验原理 /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /xxxx CRC 查表法计算结果 xxxx /xxxxxxxxxxxxxxxxxxx

31、xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / CRC 基本算式 / / VALBCRC = NNN*GX+C / VAL: 要计算的值 / BCRC: CRC 位数 / NNN: 二进制长除法的商 / C: 二进制长除法的余数(CRC 结果) /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / 例子: / Val = 原始值 = 0 xd5 / B = 原始值左移 16 位= 0 xd50000 / N = 位差 = 原始值位数-1 = 8-1 = 7 位 / A = 多项式的值N = 0 x11021 NN

32、NN /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / GX 多项式的值 1101,1000 / /- _ / 1,0001,0000,0010,0001 / 1101,0101,0000,0000,0000,0000 = 数值 B(首次余数) / 数值 A=GX(N=7) 1000,1000,0001,0000,1000,0000 / _ / 1011,1010,0010,0001,0000,000 = 数值 B(新的余数) / 数值 A=GXGX 继续 XOR / _ / (需要降幂) 1100,1000,1100,0110,

33、0000,0 = 数值 B(新的余数) / 数值 A=GX(N=4) 1000,1000,0001,0000,1000,0 / _ / 1000,0001,1010,1101,0000 = 数值 B(新的余数) / 数值 A=GX(N=3) 1000,1000,0001,0000,1000 / _ / 1001,1011,1101,1000 位数GX = CRC 结果 /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /xxxx 计算程序源码: /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

34、xxxxxxxxxxxxxxxxxxx BYTE BCRC = 0 x08; / CRC 位数 DWORD GX = 0 x107;/ CRC 多项式的值, G(x) = x8+x2+x+1 / 生成表源程序 WORD CRC(BYTE Val) if(Val=0) return 0 x00; for(BYTE N=7;N;N-) if(Val/ 计算位差(位差最大 7 位) DWORD A = GXN; / 除数多项式的值左移(原始值位数-1)位生成除数 DWORD B = ValBCRC; / 余数(原始值左移 8/16/32 位生成被除数=第 0 次的余数) DWORD C; / 上一次余数 do C = B; / 保存上次的余数 B = BA; / 计算新的余数 while(N-) / 自动降幂 if(B被除数,需要自动降幂,并应重新计算 B = C(GXN);/ 降幂重新计算 A = GX=(1=多项式位数,继续相除 return (WORD)B;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1