当前位置: 首页 > news >正文

Flutter之CRC校验

在线CRC校验网站链接:

Online CRC-8 CRC-16 CRC-32 Calculator

Sunshine's Homepage - Online CRC Calculator Javascript

1. CRC算法介绍

CRC(Cyclic Redundancy Check)校验算法是一种广泛应用于数据通信和存储系统中的错误检测方法,主要用于检测数据在传输过程中是否发生了变化。

CRC算法的具体实现过程如下

1.将待发送的数据视为一个二进制多项式D(x),其中每一位代表一个系数。
2.选取一个生成多项式G(x),该多项式的长度决定了CRC校验码的长度。
3.对D(x)乘以x^n(n为生成多项式的长度减1),形成一个与G(x)同阶的多项式。
4.使用生成多项式G(x)对该扩展后的多项式进行模2除法,得到的余数即为CRC校验码。
5.将CRC校验码附加到原始数据的末尾,形成完整的数据包。
6.在接收端,对数据包再次进行相同的模2除法运算,若余数为零,则认为数据包未发生错误。

2. CRC校验算法分类

CRC算法的分类主要依据生成多项式的长度和特性,这些差异导致了CRC校验码的不同长度和错误检测能力。

CRC16、CRC32、CRC8等都是根据生成多项式的位数命名的,分别表示16位、32位和8位的校验码长度。

2.1 CRC8

CRC8生成的校验码长度为8位(1字节)。它通常用于小数据量的校验,比如在一些简单的通信协议中,或者是对字节级数据进行校验。

由于校验码长度较短,CRC8的冲突概率较高,但是计算速度非常快。

2.2 CRC16

CRC16生成的校验码长度为16位(2字节)。它适用于中等大小的数据块校验,例如在串行通信中或者对短消息进行校验。

CRC16的冲突概率比CRC8低,但仍然存在一定的可能性,尤其是在校验较长的数据流时。 

2.3 CRC32

CRC32生成的校验码长度为32位(4字节)。它是最常见的CRC算法,适用于对大型数据块、文件或者网络数据包进行校验。

CRC32提供了更高级别的错误检测能力,冲突率极低,适合于需要高度可靠性的数据传输场景。

计算CRC32虽然相对于CRC16和CRC8要稍微慢一些,但由于现代处理器的速度,这种差异在实际应用中往往可以忽略。

除了上述常见的CRC版本,还有CRC64,生成64位的校验码,适用于要求极高可靠性的应用中。

3. 代码实现

3.1 CRC16校验
  String calculateCRC16(List<int> data) {int crc = 0xFFFF;for (int byte in data) {crc ^= byte;for (int i = 0; i < 8; i++) {if ((crc & 0x0001) != 0) {crc >>= 1;crc ^= 0xA001;} else {crc >>= 1;}}}// 将CRC16校验和表示为十六进制字符串String crcString = crc.toRadixString(16).padLeft(4, '0').toUpperCase();return crcString;}

3.2 CRC32校验

1.下载crclib插件

dart pub add crclib

2.确认校验类型

  • CRC-32
  • CRC-32/BZIP2
  • CRC-32/JAMCRC
  • CRC-32/MPEG-2
  • CRC-32/POSIX
  • CRC-32/SATA
  • RC-32/XFER
  • CRC-32C
  • CRC-32D
  • CRC-32Q

3.使用crclib插件,这里以CRC-32/MPEG-2为例,如果要其他crc类型,只要进入Crc32Mpeg2所在的类后就能看到其他的类型了

  var crcValue = Crc32Mpeg2().convert([1,2,3,4,255]).toRadixString(16).padLeft(8, "0");

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity编辑器开发 Immediate Mode GUI (IMGUI)
  • 多目标应用:基于多目标雾凇算法(MORIME)的移动机器人路径规划研究(提供MATLAB代码)
  • 电脑办公之基础操作(持续更新)
  • 帆软报表使用url访问报表,自定义前端搜索,优化报表展示
  • 使用GPU加速及配置
  • java反射:动态修改注解上属性的值
  • java 实现的单例,在static块中实例化是否会有线程安全问题?
  • golang闭包中变量获取
  • pyro.optim pyro ppl 概率编程 优化器 pytorch
  • 食品安全管理员考试真题题库及答案
  • Python爬虫—教你用Python爬取小说,小白也能操作(附源码)
  • 【C++ Primer Plus习题】10.4
  • 量子运算-计算新时代的开端
  • Java健康养老智慧相伴养老护理小程序系统源码代办陪诊陪护更安心
  • Nginx: 性能优化之提升CPU效率以及TCP的三次握手和四次挥手
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Apache Pulsar 2.1 重磅发布
  • classpath对获取配置文件的影响
  • ESLint简单操作
  • es的写入过程
  • GitUp, 你不可错过的秀外慧中的git工具
  • Javascript 原型链
  • JavaScript设计模式系列一:工厂模式
  • Java小白进阶笔记(3)-初级面向对象
  • LeetCode算法系列_0891_子序列宽度之和
  • MQ框架的比较
  • Promise面试题2实现异步串行执行
  • Sass Day-01
  • Terraform入门 - 3. 变更基础设施
  • vue2.0项目引入element-ui
  • webpack入门学习手记(二)
  • 搭建gitbook 和 访问权限认证
  • 模型微调
  • 一些css基础学习笔记
  • RDS-Mysql 物理备份恢复到本地数据库上
  • UI设计初学者应该如何入门?
  • 昨天1024程序员节,我故意写了个死循环~
  • ‌JavaScript 数据类型转换
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #define与typedef区别
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (1)(1.13) SiK无线电高级配置(五)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (算法)N皇后问题
  • (五十)第 7 章 图(有向图的十字链表存储)
  • ******之网络***——物理***
  • **python多态
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 代码性能 - (1)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...