CRC16

CRC选择

当数据帧长度在8bits-128bits范围内时,推荐CRC-8(CRC-8能够减少额外比特的开销,且有更好的性能表现)
当数据帧长度在128bits-2048bits范围内时,推荐CRC-12,CRC-16,CRC-CCITT(CRC-12额外比特的开销更小,且用于6bit字符流的传输;对于16bits的标准,更推荐美国标准CRC-16,性能略优于CRC-CCITT);
当因数据帧长度更长、信道不稳定等情况而需要更高的性能时,CRC-32、CRC-32C将是更好的选择;

CRC简介

CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。16位的CRC码产生的规则是先将要发送的二进制序列数左移16位后,再除以一个多项式,最后所得到的余数既是CRC码,

求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码。本文不讨论32位的CRC算法,有兴趣的朋友可以根据本文的思路自己去推导计算方法。CRC-16:(美国二进制同步系统中采用)CRC-CCITT:(由欧洲CCITT推荐)CRC-32:接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。

CRC16 标准

目前常用CRC16算法主要是依据以下两种标准:

CRC16 算法

按照使用环境不同,主要有以下三种实现:

  1. 按位计算
    程序空间十分苛刻但 CRC 计算速度要求不高的微控制器系统
  2. 按字节计算
    程序空间较大且 CRC 计算速度要求较高的计算机或微控制器系统,
  3. 半字节计算
    程序空间不太大,且 CRC 计算速度又不可以太慢的微控制器系统。

按位计算流程

  1. CRC-16码由两个字节构成,在开始时CRC寄存器(预置一个16位寄存器,称之为CRC寄存器)的每一位都预置为1,即为0xFFFFH,
  2. 然后把CRC寄存器与8-bit的数据进行异或
  3. 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。
  4. 重复上述的由高至低的移位8次,第一个8-bit数据处理完毕
  5. 用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。
  6. 所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
uint16_t CRC16(uint8_t * Msg,uint16_t DataLen)
{uint16_t i = 0;uint16_t j = 0;uint16_t crc16 = 0xFFFF;for (i = 0;i < DataLen;i++){crc16 = crc16 ^ Msg[i];for (j = 0;j < 8;j++){if (crc16 & 0x01)crc16 = (crc16 >> 1) ^ 0xA001; //0xA001为0x8005按bit位颠倒后的生成项else crc16 = crc16 >> 1;}}return crc16 ;
}

CRC16的校验码是两个字节,所以使用 uint16_t类型(unsigned short int)
CRC16要校验的数据位是8位
在求解CRC校验码的过程中,会用到模二除,实际我们最后不关心它的商Q(x),只关心关心余数R(x),它也是两个字节的大小
余数R(x)分为高字节RH(x)和低字节RL(x)两个部分:R(x) = RH(x) * X^8 + RL(x) (这个+,可以理解成异或,也可以理解成+号)
任何数和0异或结果还是这个数

直接查表

static const uint8_t auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
};
static const uint8_t auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 
0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 
0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 
0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 
0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 
0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 
0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 
0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 
0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 
0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,  
0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 
0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 
0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,  
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,  0x40
};
uint16_t CRC16(uint8_t * Msg,uint16_t DataLen)
{uint8_t  uchCRCHi = 0xff;uint8_t  uchCRCLo = 0xff;uint32_t uIndex;while(DataLen--){uIndex   = uchCRCLo ^ *Msg++;uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];uchCRCHi = auchCRCLo[uIndex]; }return ((uchCRCHi << 8) | (uchCRCLo));
}
  1. On-line CRC calculation and free library  On-line CRC calculation and free library - Lammert Bies
  2. 我学习CRC32、CRC16、CRC原理和算法的总结(与WINRAR结果一致) - 百度文库 (baidu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/350977.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

linux中ls -l出的crw brw lrw代表什么?

原文链接&#xff1a;https://www.cnblogs.com/victorywr/p/15725170.html 每次使用ls -al 查看文件信息&#xff0c;都只看rw-rw-rw- &#xff08;权限为666&#xff09;&#xff0c;忽略最前面的c/b/l&#xff0c;今天了解一下&#xff1a; linux中c表示字符设备文件&#xf…

一款红队批量脆弱点搜集工具

功能 指纹识别:调用“三米前有香蕉皮“前辈工具&#xff0c;他的工具比finger好用 寻找资产中404&#xff0c;403&#xff0c;以及网页中存在的其他薄弱点&#xff0c;以及需要特定路径访问的资产 后续会把nuclei加进来 目前只有windows可以用 使用 第一次使用脚本请运行p…

【机器学习】正则化详解和过拟合的解决

https://blog.csdn.net/weixin_45434953/article/details/130970273 上一篇文章的例子中&#xff0c;如果使用一个四次多项式去拟合房价函数&#xff0c;会导致过拟合问题 而正则化是解决过拟合的一个方法。右图过拟合是因为其三次方项和四次方项的影响&#xff0c;我们再回顾…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换骨干网络之 GhostNet | 从廉价操作中获取更多特征

论文地址:https://arxiv.org/abs/1911.11907 代码地址:https://github.com/huawei-noah/ghostnet 由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络(CNN)很困难。特征图中的冗余是那些成功的神经网络的重要特征,但在神经架构设计中很少研究。本文提出了一种新的G…

【测试入门】测试用例经典设计方法 —— 因果图法

01、因果图设计测试用例的步骤 1、分析需求 阅读需求文档&#xff0c;如果User Case很复杂&#xff0c;尽量将它分解成若干个简单的部分。这样做的好处是&#xff0c;不必在一次处理过程中考虑所有的原因。没有固定的流程说明究竟分解到何种程度才算简单&#xff0c;需要测试…

妙啊!真实模拟面试 — 面试官究竟会怎么问 数据库索引呢?

什么是索引&#xff1f; 面试官&#xff1a;我看你项目中有做过 SQL 优化&#xff0c;那我们今天就来聊聊索引吧。 &#xff08;索引能问些啥&#xff0c;无非是索引的概念、索引的使用规则、索引的分类、索引的原理。嘻嘻~我早有准备&#xff09; 我&#xff1a;数据库中的…

一道面试题:餐馆模拟

前阵子遇到一个面试题&#xff0c;当时没有做出来&#xff0c;后来断断续续的用了一周的时间做了出来&#xff0c;但感觉也不完全对&#xff0c;先来看看题目&#xff0c;稍后再讨论。 问题 模拟一个餐馆&#xff0c;三个厨师&#xff0c;二个服务员&#xff0c;厨师单独做菜…

AI模拟面试官项目实战 | 项目概述

&#x1f3af;摘要 看完本文&#xff0c;你可能有如下收获&#xff1a; 了解该项目的预览效果、了解技术栈、系统设计以及教程食用指南 ⭐️⭐️该收获仅供参考&#xff0c;真实收获以实物为准&#x1f607;&#x1f607; ☀️系统概述 【AI模拟面试官】是一个模拟线上面试的…

软件测试面试题【2021模拟面试整理版(含答案)】

点击上方蓝色“程序员一凡”&#xff0c;选择“设为星标” 主页点击“领取资料”获取整理好的学习资源 一、问题预测 \1. 让简单介绍下自己&#xff08;每次面试开场&#xff09; \2. 让说下自己会的内容 \3. 看了哪些书籍&#xff08;有问到&#xff09; \4. 了解过哪些技…

Java程序员模拟面试,解析面试困扰和建议

模拟面试&#xff0c;相信大多数程序员都没有经历过&#xff0c;甚至还有从来没听说针对面试的辅导或者模拟面试啥的&#xff0c;所有的面试经验都来源于网上写的一些文章&#xff0c;然后再在面试的时候通过各种碰壁去揣测面试官在想啥。 前言 前几天组织了一次模拟面试直播&…

模拟面试题一

一、选择题 1、python不支持的数据类型有 A、charB、intC、floatD、list 1 参考答案&#xff1a;A 参考答案 2、打印输出结果&#xff1a;x "foo"y 2print(x y)A.foo B.foofoo C.foo2 D.2 E.An exception is thrown 1 D &#xff1a;一个是字符串&#…

前端面试题总结:模拟面试

1&#xff0c;问&#xff1a;请先自我介绍&#xff1f; 答&#xff1a;略 二&#xff0c;技术知识题 1&#xff0c;问&#xff1a;看你简历有项目经历&#xff0c;那在你之前的项目中&#xff0c;用到的技术栈有哪些&#xff1f; 答&#xff1a;主要使用过vue和微信小程序&…

模拟面试题回顾

模拟面试题回顾 1.servlet里面有哪些关键的方法&#xff1f; 讲到它的方法&#xff0c;就不可避免地去了解servlet的运行过程(也可以说是生命周期)&#xff0c;如下图所示&#xff1a; 它的四个过程&#xff1a; ​ (1).当客户端第一次发送请求后&#xff0c;由容器&#xf…

java-模拟面试

讲一下快速排序算法 通过一次排序将数列分为两部分&#xff0c;一部分比另一部分数字都小 时间复杂度O(nlogn) 空间复杂度O(1) 先确定一个中间比较值&#xff0c;确定一个左指针&#xff08;从头开始&#xff09;&#xff0c;右指针&#xff08;从尾部开始&#xff09; while循…

如何模拟面试?

我是艾木&#xff1a; 1.从学生到职场 当初毕业找工资的场景&#xff0c;至今还记忆犹新。 当时的自己还是学生的身份&#xff0c;正处于找工作的浪潮中&#xff0c;当时的校园招聘如火如荼&#xff0c;工作岗位也琳琅满目。一时间仿佛置身于百货商场之中&#xff0c;每个人都在…

微信小程序 | 基于ChatGPT实现模拟面试小程序

Pre:效果预览 ① 选择职位进行面试 ② 根据岗位职责进行回答 一、需求背景 这两年IT互联网行业进入寒冬期,降本增效、互联网毕业、暂停校招岗位的招聘,各类裁员、缩招的情况层出不穷!对于这个市场来说,在经历了互联网资本的疯狂时代,现在各大需要的时候更多能实实在在挣…

ChatGPT专业应用:模拟求职面试

正文共 663 字&#xff0c;阅读大约需要 3分钟 应届毕业生求职面试必备&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 1.专属面试导师 2.掌握高频面试题回答要点 Beezy评级&#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 …

Python入门教程+项目实战-13.2节-集合的操作方法

目录 13.2.1 集合的常用操作方法 13.2.2 集合的查找 13.2.3 集合的添加 13.2.4 集合的删除 13.2.4 集合运算 13.2.5 知识要点 13.2.6 系统学习python 13.2.1 集合的常用操作方法 集合类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff…

谈谈互联网广告拍卖机制的发展:从GSP到DeepAuction

广告作为各互联网公司收入的大头&#xff0c;其拍卖机制设计因此也是关乎营收最为核心的方面。所谓的广告拍卖机制设计是指如何将有限的广告位分配给合适的广告&#xff0c;从而达到客户、平台以及用户三方的价值最优。 当前的广告拍卖被建模为暗拍的形式&#xff0c;即N个广告…

音乐人解密:究竟是如何一步一步成为音乐人的?

音乐人解密&#xff1a;究竟是如何一步一步成为音乐人的&#xff1f; 音乐是人类伟大的产物&#xff0c;近些年来越来越多的人都开始尝试学习音乐&#xff0c;成为一名音乐人。而艺术高考等途径也为许多想要学习音乐、成为职业歌手或者编曲师的人群提供了途径。然而想要成为一名…