Last active
August 29, 2015 14:07
-
-
Save mintisan/f067cf315692db0c2437 to your computer and use it in GitHub Desktop.
crc_ccitt from Linux Kernel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "crc-ccitt.h" | |
// From : http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/crc-ccitt.h?v=2.6.11.8#L11 | |
static u16 crc_ccitt_byte(u16 crc, const u8 c) | |
{ | |
return (crc >> 8) ^ crc_ccitt_table[(crc ^ c) & 0xff]; | |
} | |
//From : http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/lib/crc-ccitt.c?v=2.6.11.8#L63 | |
/* | |
* This mysterious table is just the CRC of each possible byte. It can be | |
* computed using the standard bit-at-a-time methods. The polynomial can | |
* be seen in entry 128, 0x8408. This corresponds to x^0 + x^5 + x^12. | |
* Add the implicit x^16, and you have the standard CRC-CCITT. | |
*/ | |
u16 const crc_ccitt_table[256] = { | |
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, | |
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, | |
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, | |
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, | |
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, | |
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, | |
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, | |
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, | |
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, | |
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, | |
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, | |
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, | |
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, | |
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, | |
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, | |
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, | |
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, | |
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, | |
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, | |
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, | |
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, | |
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, | |
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, | |
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, | |
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, | |
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, | |
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, | |
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, | |
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, | |
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, | |
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, | |
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 | |
}; | |
/** | |
* crc_ccitt - recompute the CRC for the data buffer | |
* @crc: previous CRC value | |
* @buffer: data pointer | |
* @len: number of bytes in the buffer | |
*/ | |
u16 linux_crc_ccitt(u16 crc, u8 const *buffer, size_t len) | |
{ | |
while (len--) | |
crc = crc_ccitt_byte(crc, *buffer++); | |
return crc; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
typedef unsigned short u16; | |
typedef unsigned char u8; | |
#define CRC_INIT 0xffff //CCITT初始CRC为全1 | |
#define GOOD_CRC 0xf0b8 //校验时计算出的固定结果值 | |
u16 linux_crc_ccitt(u16 crc, u8 const *buffer, size_t len); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "crc-ccitt.h" | |
int main(void) | |
{ | |
unsigned char p[]= {0xa0,0xb0,0xff, 0xff}; | |
unsigned short crc; | |
//发送 | |
crc= linux_crc_ccitt(CRC_INIT,p, 2); //计算前两位的CRC码 | |
crc^=0xffff; //对其取反,实际应用中,发送端一定要记着这一步!!! | |
p[2]=crc&0x00ff; //将计算的CRC码加到信息序列后面 | |
p[3]=crc>>8&0x00ff; //封装成代CRC码的发送数组缓冲 | |
printf("p[2]=%x,p3=%x\n",p[2],p[3]); | |
//接收 | |
crc=linux_crc_ccitt(CRC_INIT, p,4); //对信息码+CRC码共同计算得出CRC=0xf0b8,假设接收端就是这些内容 | |
printf("crc is %x\n",crc); | |
if(crc==GOOD_CRC) | |
printf("check ok!\n"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment