CRC-16 IBM x 16 + x 15 + x 2 + 1
CRC编码的原理,网上有很多,简单的说就是将数据用生成式进行模2除法。
这里我主要写一下,查表法的原理。
一、原理:
数据项: <BnBn-1Bn-2Bn-3,...,B3B2B1>
先查表获得Bn的两字节余式,将该余式的高8位与Bn-1进行模2运算,假定B'n-1,低8位与Bn-2进行模2运算,假定结构为B'n-2,得到< B'n-1B'n-2Bn-3,...,B3B2B1 >,以此类推,最终获得两字节的CRC码.(参考字节型CRC算法实现一文)
二、实现
以下代码中中的查表法来自于 Linux-2.6.17,定义法是根据定义编写的,我使用随机数对两种方法进行了比对,结果一致
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
typedef unsigned int u16;
typedef unsigned char u8;
u16 const crc16_table[256] = {
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,