CRC16 小查表法

#include
“stdafx.h”

 
 

static
unsigned
short crcTlb[] = { 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,

0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400 };

 
 

static
unsigned
short CalcCRC16(unsigned
short * pBuf, unsigned
int
length)

{

    unsigned
int i = 0, ch = 0;

    unsigned
int crc = 0xFFFF;

    for (i = 0; i < length; i++)

    {

        ch = pBuf[i];

        crc = crcTlb[(ch ^ crc) & 0x000F] ^ (crc >> 4);

        crc = crcTlb[((ch >> 4) ^ crc) & 0x000F] ^ (crc >> 4);

    }

    crc = (crc & 0x00FF) << 8 | (crc >> 8);

    return crc;

}

 
 

 
 

int main()

{

    unsigned
short ar[] = {0x01,0x03,0x00,0x56,0x00,0x09};

    unsigned
short crc16 = CalcCRC16(ar,6);

    printf(“%X\n”, crc16);

return 0;

}

 
 

运算符

意义

示例

对于每个位位置的结果(1=设定,0=清除)

    &    

位 AND

 x&y 

如果 x 和 y 都为 1,则得到 1;如果 x 或 y 任何一个为 0,或都为0,则得到 0

    |    

位 OR

 x|y 

如果 x 或 y 为 1,或都为 1,则得到 1;如果 x 和 y 都为 0,则得到 0

    ^    

位 XOR

 x^y 

如果 x 或 y 的值不同,则得到 1;如果两个值相同,则得到 0

    ~    

位 NOT(I的补码)

 ~x 

如果 x 为 0,则得到 1,如果 x 是 1,则得到 0

 
 

运算符

意义

示例

结果

<<

向左移位

x<<y

x 的每个位向左移动 y 个位

>>

向右移位

x>>y

x 的每个位向右移动 y 个位

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注