crc16是什么算法

核心概念

CRC16​ 是一种循环冗余校验算法,属于哈希函数的一种。它的核心目的是检测数据的错误,通常用于数字网络和存储设备中,来验证数据在传输或存储后是否依然完整、无误。

你可以把它想象成一个数据的“指纹”或“摘要”。发送方计算出一段数据的 CRC16 值并随数据一起发送,接收方在收到数据后同样计算 CRC16 值。如果两个值相同,则认为数据在传输过程中极大概率没有出错;如果不同,则肯定发生了错误,数据需要重传。

算法原理(通俗版)

CRC16 的计算过程可以类比于一种特殊的“除法”,但不是在数字上做除法,而是在二进制位上做。

  1. 选定一个除数​:这个除数是一个固定的、预先定义好的二进制数,称为 ​​“生成多项式”​。不同的多项式会产生不同的CRC校验结果,从而形成了不同的CRC16标准(如CRC-16-CCITT、CRC-16-MODBUS等)。这个除数通常被称为 ​​“Poly”​

    • 例如,一个常用的多项式是 0x1021(十六进制表示),其二进制为 1 0000 0010 0001(共17位)。

  2. 准备被除数​:在原始数据的末尾添加一串 0(零),添加的 0的数量等于 CRC 值的长度(CRC16就是16位,所以添加16个0)。这个新组成的数就是“被除数”。

  3. 执行“除法”​​:

    • 将“被除数”与“生成多项式”对齐。

    • 进行 ​​“模2除法”​​(也叫“异或除法”)。这种除法的特点是:它不看商是多少,只看余数;并且每一步的减法操作不借位,实际上就是进行异或(XOR)运算

    • 用生成多项式(除数)对数据的前几位进行异或操作,得到一个结果,然后向右“滑动”一位,继续处理后续的数据位。

  4. 得到余数​:经过整个“除法”过程后,最终得到的余数就是 ​CRC16 校验值。这个余数的长度肯定会小于除数的长度(即16位),所以它是一个16位的值,通常用4个十六进制数字表示(如 0xC3A7)。

关键点​:这个计算过程可以通过硬件电路(由移位寄存器和异或门组成)高效实现,也可以通过软件查表法来极大提升速度,因此非常适合在通信协议中快速使用。


主要特点

  • 检测错误能力​:CRC16 能有效检测出:

    • 所有单比特错误。

    • 所有的双比特错误(只要多项式选择得当)。

    • 任何奇数位的错误。

    • 大多数突发性错误(连续多位错误)。

  • 非加密​:CRC是校验码,不是加密哈希​(如MD5, SHA)。它的目的是检测无意的、随机的错误,而不是防止有意的篡改。它非常容易反向计算和伪造。

  • 输出长度固定​:无论输入数据多长,输出永远是16位(2字节)。

  • 计算速度快​:硬件和优化的软件实现都非常高效。


常见的 CRC16 标准

“CRC16”是一个统称,具体使用哪种取决于生成多项式、初始值、输入输出是否反转等参数。最常见的几种是:

  1. CRC-16-CCITT (XMODEM)​

    • 多项式: 0x1021(正常形式)

    • 初始值: 0x0000

    • 常用于XMODEM协议、蓝牙、PC串口等。

  2. CRC-16-CCITT (KERMIT) / CRC-16-MODBUS

    • 多项式: 0x1021

    • 注意​:Kermit和MODBUS版本在初始值和反转规则上与XMODEM不同。MODBUS是工业领域极其常见的标准。

    • MODBUS参数:初始值 0xFFFF,输入输出都反转。

  3. CRC-16-USB

    • 多项式: 0x8005(另一种常见形式)

    • 初始值: 0xFFFF

    • 用于USB数据包校验。

重要提示​:正因为参数不同,在开发时必须明确约定使用哪一种CRC16变体,否则通信双方计算出的校验码会不一致,导致通信失败。


简单示例

假设我们有一个简单的数据 0x01, 0x02,使用最简单的参数(初始值0)计算。

  1. 数据二进制: 00000001 00000010

  2. 后面加16个0: 00000001 00000010 00000000 00000000

  3. 用多项式 0x1021(二进制: 0001000000100001) 对这个长长的数进行模2除法。

  4. 最终会得到一个16位的余数,比如(假设的)0xE2F1

这个 0xE2F1就是CRC16校验码,它会跟随数据 0x01, 0x02一起被发送出去。

总结

CRC16​ 是一种高效、可靠的错误检测算法,通过一种特殊的二进制除法得到数据的16位“指纹”。它广泛应用于网络通信(如MODBUS)、数据存储(如ZIP文件)等场景,以确保数据的完整性。在使用时,最关键的是要确保通信双方采用完全相同的CRC16标准参数。

你可以使用在线的CRC计算器或编程语言中的相关库(如Python的crcmod、C#的System.IO.Hashing.Crc32等)来轻松计算它。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day8--HOT100--160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点

Day8–HOT100–160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点 每日刷题系列。今天的题目是力扣HOT100题单。 链表题目。 160. 相交链表 思路【我】: 1,计算链表长度 2,令A为较短链&am…

Rust面试题及详细答案120道(58-65)-- 集合类型

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

Horse3D游戏引擎研发笔记(八):在QtOpenGL环境下,按需加载彩虹四边形的顶点属性 (Unity、Unreal Engine、Three.js与Godot)

在上一篇博客中,我们探讨了如何在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形。本文将延续这一主题,深入探讨如何在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能是Horse3D引擎渲染系统的重要组成部分,旨在实现灵活…

模块化设计+微米级精度,GelSight Modulus 触觉型3D轮廓仪深入检测“盲区”

当航空航天工程师在精密舱体中搜寻微米级缺陷,汽车检查员在车间复杂结构里排查隐患,能源领域创新者尝试突破检测边界时,深耕视触觉 3D 显微技术的企业——GelSight,正以全新研发的GelSight Modulus触觉型3D轮廓仪(简称…

Pytorch安装详细步骤

第一步:检查显卡支持的的CUDA版本 1.打开NVIDIA控制面板 首先鼠标右击桌面-显示更多选项-NVIDIA控制面板-点击弹出界面右上角的(系统信息)-点击弹出界面的(组件) 2.查看驱动版本 打开系统信息 点击组件,查看 以观测到红色方框内的信息可以看到(NVIDIA CUDA 13.0.…

2025职场进阶:低门槛技能实用手册

每到年初,都会有人问:如果只能投入有限的时间与预算,先考哪一两本证书更划算?本文把近两年的岗位需求、学习可获得性与花费周期做了综合权衡,给出一个以“先提升通用能力,再叠加行业资质”为主线的组合方案…

SDC命令详解:使用set_timing_derate命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定降额比例 指定降额对象列表/集合 指定沿 指定最大、最小条件 指定早、晚条件 指定路径的类型 指定降额类型 指定约束 指定增量 写在最后 由于制造…

C++语言程序设计——03 进制ASCII码

目录一、进制表示与转换(一)不同进制表示(二)进制转换方法二、ASCII 码(一)ASCII 码表(二)ASCII 码转换(三)大小写英文字母转换【总结:如何记忆AS…

AtCoder Beginner Contest 420-Toggle Maze

题目描述 有一个 H行 W 列的网格。用 (i,j) 表示位于第 i 行(从上往下数)第 j 列(从左往右数)的格子。每个格子的状态用字符 Ai,j表示,含义如下: . :空格子。 #’ :障碍格子。 S &am…

20、DMA----释放CPU压力,加快传输

1、DMA介绍DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使…

深入OpenHarmony OTA硬核升级

技术背景 OpenHarmony OTA(Over-The-Air)升级子系统为设备提供了远程升级能力,通过统一的升级接口屏蔽底层芯片差异,支持轻量系统、小型系统和标准系统的全量升级、差分升级和变分区升级。 核心特性 跨系统支持:覆盖轻量系统(Hi3861)、小型系统(Hi3516DV300)、标准系…

华为iVS1800接入SVMSPro平台

华为iVS1800接入SVMSPro平台 ** 华为好望Huawei HolosensIVS1800智能视频云平台采用首款昇腾310加持的嵌入式系统智能微边缘,独俱普惠AI鸿力。一台融合存储、计算、检索功能,满足小型园区、社区、银行网点、超市等场景安防需求,小机大智。 …

《异形战机2》v2.0.4数字豪华版,3D横版射击再临,机体武器海量升级

[游戏名称]: 《异形战机2》v2.0.4数字豪华版 [软件大小]: 17.7 GB [软件大小]: 夸克网盘 | 百度网盘 游戏介绍 《异形战机:最终版2》续作震撼登场!经典横版射击全面升级:3D 画面炫目、关卡与机体海量扩充,只为带来酣畅淋漓的灭…

Java 异常(Throwable)

1. Throwable Throwable: 所有异常和错误的根类。实现 Throwable 或其子类的对象才能被 throw 或 catch。 Error: 表示严重的系统级问题,通常不应该被捕获或处理,程序通常无法从中恢复。 Exception: 表示程序可以处理的问题。分为 运行时异常、 受检异常…

rocketmq常用命令

官方文档 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ运维管理命令mqadm…

【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍

文章目录一、unordered系列的使用unordered_set类的介绍unordered_set和set的使⽤差异unordered_map和map的使⽤差异unordered_xxx的哈希相关接⼝二、哈希表实现哈希概念直接定址法哈希冲突负载因⼦将关键字转为整数哈希函数除法散列法/除留余数法乘法散列法处理哈希冲突开放定…

电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍电影感人文街拍摆摊纪实摄影后期 Lr 调色是一种专注于捕捉街头生活烟火气的摄影风格,通过 Lightroom 后期调色赋予画面电影般的叙事感和情感深度。这种风格以摆摊小贩、市井行人、街头场景为主体,强调真实、自然的生活瞬间。调色核心在于低饱和暖…

【数据分享】298个地级市人工智能企业数量(1990-2023)

数据介绍引言人工智能产业作为数字经济的核心驱动力,其发展规模与分布格局深刻反映区域科技创新活力与产业升级潜力。为助力相关研究,本文分享一份涵盖全国 298 个地级市 1990-2023 年的人工智能企业核心数据,包含人工智能企业存量和人工智能…

LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)

LeetCode 面试经典 150_数组/字符串_验证回文串(25_125_C_简单)题目描述:输入输出样例:题解:解题思路:思路一(双指针):代码实现代码实现(思路一(双…

无障碍辅助模块|Highcharts引领可访问数据可视化的交流

在现代数据可视化中,无障碍辅助技术已成为必不可少的一部分。对于视障人士或使用屏幕阅读器的用户来说,传统图表往往难以获取有效信息,而 Highcharts 在设计之初便充分考虑了无障碍体验。 Highcharts作为可访问数据可视化的倡导者&#xff0…