// 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));

return 0;
}

// 高位在前
unsigned short crc16_ccitt_tableH[256]={
 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

// 高位在前
// crc[0] = HIBYTE(crc)
// crc[1] = LOBYTE(crc)
unsigned short do_crcH(unsigned short crcInit, unsigned char *message, unsigned int len)
{
 unsigned short int crc = crcInit;
 while(len--)
 {
  crc = (crc<<8) ^ crc16_ccitt_tableH[((crc>>8) ^ *message++) & 0xff];
 }
 return crc;
}

// 低位在前
// 显然: 0x01相当于高位在前的 0x80
// 上面表中 0x80对应的crc是0x9188(这个数是高位在前), 再把位顺序颠倒,得到本表的0x01的crc值: 0x1189
unsigned short crc16_ccitt_tableL[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[0] = LOBYTE(crc)
// crc[1] = HIBYTE(crc)
unsigned short do_crcL(unsigned short crcInit, unsigned char *message, unsigned int len)
{
 unsigned short crc = crcInit;
 while (len--)
 {
  crc = (crc >> 8) ^ crc16_ccitt_tableL[(crc ^ (*message++)) & 0xff];
 }

return crc;
}

CCITT-CRC16相关推荐

  1. ccitt crc16

    CCITT CRC-16计算原理与实现 (2010-04-01 13:18:52)转载▼ 标签: 杂谈 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验.它是一类重 ...

  2. 【CRC笔记】CRC-16 KERMIT C语言实现

    CRC笔记 CRC-16/KERMIT 简介及C语言实现 一.CRC-16 KERMIT算法简介 二.CRC-16/KERMIT算法基本信息 三.CRC-16/KERMIT算法的C语言实现 1.查表法 ...

  3. crc16的c语言函数 计算ccitt_CCITT CRC-16计算原理与实现CRC-ITU

    CCITT CRC-16 计算原理与实现 时间: 201 1 -08-28 22:37 :20 来源: 作者: CRC 的全称为 Cy clic Redundancy Check ,中文名称为循环冗余 ...

  4. CRC-16原理及通用的16位CRC校验算法代码

    CRC-16原理及通用的16位CRC校验算法代码 循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detect ...

  5. c语言累加和校验_循环冗余校验(CRC)算法入门

    http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...

  6. CRC校验,用于大家参考和日后查阅,内容引用github,非本人创作。

    C语言 /************************************************************************ Filename: crc.h* * Des ...

  7. 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导

    CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CRC算法应是嵌入式程序员的基本技能.可是,我认识的嵌入式程序员 ...

  8. 循环冗余校验(CRC)算法入门引导

    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CR ...

  9. 循环冗余校验(CRC)算法

    作者Ross Williams,"A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS". 本文的目标是介绍CRC算法的基本原理和实 ...

  10. CRC 算法的简单说明

    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CR ...

最新文章

  1. python语言必背代码-Python入门必须知道的11个知识点
  2. MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码
  3. 学java的正确方法_学习Java编程 这10个技巧不容错过--中享思途
  4. wxWidgets:wxList< T >类模板的用法
  5. G6 图可视化引擎——入门教程——元素及其配置
  6. 操作系统源代码_计算机自制操作系统(八):仿生DOS操作系统源代码
  7. sqlserver 分组合并列_[雅思经验]?两个月备考,一战雅思7.5分经验分享!!!
  8. linux ssh-keygen命令生成密钥 -t -C参数说明
  9. 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
  10. 未来教育计算机一级ms百度云,未来教育全国计算机二级VFP
  11. javascript中this和super用法
  12. 火狐浏览器打不开html,火狐浏览器打不开网页的原因及解决办法
  13. xp设置允许客户端远程连接_远程删除Windows XP客户端中的用户配置文件
  14. 调试华为MML协议备忘
  15. 慕尼黑大学计算机硕士专业,德国可以申请的英语授课的计算机硕士有哪些学校?...
  16. 20164305徐广皓 - Exp1 PC平台逆向破解(5)M
  17. 随手笔记Cookie
  18. 基于optix的习惯化渲染
  19. 5G网络架构与组网部署
  20. hdu4676 ------麦比乌斯反演分块

热门文章

  1. 下拉多选框 微信小程序_微信小程序下拉框功能的实例代码
  2. Codeforces Problem 708A Letters Cyclic Shift(implementation)
  3. LVGL库入门教程 - 颜色和图像
  4. 华为鸿蒙8g运存够用吗,华为手机6G运存和8G运存差距大不大?实测给你答案
  5. 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。
  6. 今日早报要闻内容12条
  7. 做亚马逊为什么一定要注册品牌?原来有这么多好处!
  8. 【git】git解决冲突
  9. 一次考过PMP成功跳槽加薪!过来人传授PMP备考秘籍
  10. JupyterLab 介绍 及简单教程