// VC2008
// CCITT-CRC16: x16+x12+x5+1
// 注: boost库有crc专门用于计算crc校验
#include "stdafx.h"
#include <windows.h>
unsigned short do_crcH(unsigned short crcInit, unsigned char *message, unsigned int len);
unsigned short do_crcL(unsigned short crcInit, unsigned char *message, unsigned int len);
int _tmain(int argc, _TCHAR* argv[])
{
// 原始数据
unsigned char data[] = {1,2,3,4,5};
// 初始crc
unsigned short initCrc = 0xFFFF;
// 计算低位在前CRC
unsigned short crcL = do_crcL(initCrc, data, sizeof(data));
unsigned char crc16_L[2] = {0};
crc16_L[0] = LOBYTE(crcL);
crc16_L[1] = HIBYTE(crcL);
// 计算高位在前CRC
unsigned short crcH = do_crcH(initCrc, data, sizeof(data));
unsigned char crc16_H[2] = {0};
crc16_H[0] = HIBYTE(crcH);
crc16_H[1] = LOBYTE(crcH);
// 注意, 有的CRC在保存前附加了一个取反操作(即陪集码为0xFFFF), 则拉通运算的结果不为0, 而是另外一个固定常量
// 验证低位在前CRC, 拉通CRC为0
unsigned char dataL[] = {1,2,3,4,5, crc16_L[0], crc16_L[1]};
unsigned short crcCheckL = do_crcL(initCrc, dataL, sizeof(dataL));
// 验证高位在前CRC, 拉通CRC为0
unsigned char dataH[] = {1,2,3,4,5, crc16_H[0], crc16_H[1]};
unsigned short crcCheckH = do_crcH(initCrc, dataH, sizeof(dataH));
ret