三种CRC16的算法实现,结合自己的理解记录一下;

一、先说算法的C语言实现和各算法的优缺点:

1、按位计算CRC

代码如下

uint16_t crc_16(uint8_t *data, uint16_t len)
{
    uint16_t crc16 = 0x0000;
    
    while( len-- ) {
        for(uint8_t i=0x80; i!=0; i>>=1) {
            if((crc16 & 0x8000) != 0) {
                crc16 = crc16 << 1;
                crc16 = crc16 ^ 0x1021;
            }
            else {
                crc16 = crc16 << 1;
            }
            if((*data & i) != 0) {
                crc16 = crc16 ^ 0x1021;  //crc16 = crc16 ^ (0x10000 ^ 0x11021)
            }
        }
        data++;
    }

return crc16;
}

按位计算运算量比较大,占用空间小

2、按字节计算CRC

代码如下

const uint16_t crc_table[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};

uint16_t crc_16(uint8_t *data, uint16_t len)
{
    uint16_t crc16 = 0x0000;
    uint16_t crc_h8, crc_l8;
    
    while( len-- ) {

crc_h8 = (crc16 >> 8);
        crc_l8 = (crc16 << 8);
        crc16 = crc_l8 ^ crc_table[crc_h8 ^ *data];
        data++;
    }

return crc16;
}

按字节计算运算量小,占用空间大

3、按半字计算CRC

代码如下

const uint16_t crc_table[16] ={
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef};

uint16_t crc_16(uint8_t *data, uint16_t len)
{
    uint16_t crc16 = 0x0000;
    uint16_t crc_h4, crc_l12;
    
    while( len-- ) {
        crc_h4 = (crc16 >> 12);
        crc_l12 = (crc16 << 4);
        crc16 = crc_l12 ^ crc_table[crc_h4 ^ (*data >> 4)];
        crc_h4 = (crc16 >> 12);
        crc_l12 = (crc16 << 4);
        crc16 = crc_l12 ^ crc_table[crc_h4 ^ (*data & 0x0f)];

data++;
    }

return crc16;
}

按半字计算运算量比按字节计算大约1倍,表占用空间只有1/16

二、算法的理解:

1、按位计算:

首先CRC算法即为一个序列与多项式(CCITT:0x11021)进行模2除法,然后按位计算CRC可以理解为首先将第一个位与多项式进行模二除法,得到一个余数,再将余数右移一位加上(不进位加法)第二个位再与多项式进行模二除法,直到计算到最后一位

2、按字节计算:

由于按位计算计算量较大,因此出现有了按字节计算,按字节位计算CRC可以理解为首先将第一个字节与多项式进行模二除法,得到一个余数,再将余数右移八位加上(不进位加法)第二个字节再与多项式进行模二除法,直到计算到最后一字节。在将一个字节与多项式进行模二除法时运算量较大,因此将0x00-0xff与多项式的计算结果提前计算出来,保存为一个数组,从而减小运算量,因此按字节计算CRC的表格由此而来。

3、按半字计算:

由于按字节计算需要存在256个16位数据,所以需要512个字节的空间,对于部分系统存在空间不足的情况,因此出现了按半字节计算的方式,由于半字节只能表示0-15,所以只需16个16位的数据,32个字节空间

三种CRC16 C语言算法理解(CCITT)相关推荐

  1. pca算法python代码_三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  2. 漫画:三种 “奇葩” 的排序算法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 在算法的世界里,有许多高效率的排序算法,比如快速排序.归并排序.桶 ...

  3. 计算机组成原理 王道考研2021 第一章:计算机组成原理概述 -- 计算机的工作过程(从源程序到可执行文件)、计算机的层次结构、计算机软件的分类、三种级别的语言

    1. 计算机的工作过程 计算机的工作过程分为以下三个步骤: 把程序和数据装入主存储器. 将源程序转换成可执行文件. 从可执行文件的首地址开始逐条执行指令. 1.1 从源程序到可执行文件 预处理阶段:预 ...

  4. 实现二叉树的三种非递归遍历算法

    [问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...

  5. java 三种错误类型 区别_请列举至少三种在java语言中发生“严重错误”的情况...

    [简答题]自已编写一个自定义非整数异常类,来处理一个异常 [填空题]捕获异常时,可以把catch捕获的异常对象( ),使上层try-catch结构继续处理该异常事件;也可以把异常对象转换为其它异常对象 ...

  6. 在修路的时候或者建筑工地,为什么要有人支着一个三脚架测量,其实三脚架上面还有仪器的,通常是四种:水准仪、经纬仪、全站仪、GPS。(前三种较常见)可以理解为分别测:高度差、角度、距离加角度、地理坐标

    我是学这个的,学过一年,专业是土地资源管理. 其实三脚架上面还有仪器的,通常是四种:水准仪.经纬仪.全站仪.GPS.(前三种较常见) 可以理解为分别测:高度差.角度.距离加角度.地理坐标. 只有实际测 ...

  7. spwm控制算法c语言实现,三种SPWM波形生成算法的分析与实现

    标签: SPWM SPWM(Sinusoidal PWM)法是一种比较成熟的,目前使用较广泛的PWM法.前面提到的采样控制理论中的一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果 ...

  8. pca算法python实现_三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  9. python中pca算法_Python使用三种方法实现PCA算法

    主成分分析(PCA) vs 多元判别式分析(MDA) PCA和MDA都是线性变换的方法,二者关系密切.在PCA中,我们寻找数据集中最大化方差的成分,在MDA中,我们对类间最大散布的方向更感兴趣. 一句 ...

最新文章

  1. dpi shell命令 安卓_android 中 dumpsys 命令使用
  2. Robot 3D Map Navigation
  3. rocketmq(三 java操作rocket API, rocketmq 幂等性)
  4. 热榜第四:GitHub开源代码数据集界ImageNet,推出代码搜索挑战赛
  5. linux 显示文字在桌面背景,Linux下Xwindow的字体配置(所谓的字体美化)
  6. 【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用
  7. Java加密与解密的艺术~SHA算法实现
  8. php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]
  9. linux cpu不足处理运维,Linux运维知识之Linux服务器CPU占用率较高问题排查思路
  10. 达观RPA自动订单处理机器人, 助力制造业订单处理效率提升
  11. 若计算机系统有120个终端,概率论答案 - 李贤平版 - 第五章
  12. SolidWorks2010
  13. Pandas数据分析3-统计、可视化、创建数据框、时间序列、删除数据
  14. 艺龙的执着与固执:等待微信
  15. 2015,走上人生巅峰,让APK编辑器祝您一臂之力!
  16. 表格识别-pytorch
  17. UVa 1616 商队抢劫者(Caravan Robbers)
  18. 基于python LDA模型的英文推特邮件主题分析 完整数据+代码 可直接运行
  19. Future异步回调详解
  20. 关于人发声的原理及模型

热门文章

  1. 计算机桌面文件在哪儿,电脑微信接收文件存在哪里 接收文件保存电脑位置介绍...
  2. cad绘制正八边形_CAD怎么画正八边形 看完你学会了么
  3. Python应用之批量打水印
  4. 比亚迪F6专用高清车载导航影音登场
  5. JAVA学习代码——验证手机号码是否正确
  6. 2019.11.28
  7. [宅]最近3个月的宅生活
  8. Teradata天睿任命王波为大中华区总裁
  9. 实变函数—有限覆盖定理的证明
  10. PostgreSQL的upsert功能(on conflict do)的用法