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

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


http://www.kler.cn/a/289424.html

相关文章:

  • 高频 SQL 50 题(基础版)连接部分
  • 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
  • 【Hadoop实训】Hive 数据操作①
  • 平替 Spring 正当时!Solon v3.0.3 发布
  • Kubernetes的基本构建块和最小可调度单元pod-0
  • 爬虫如何解决短效代理被封的问题?
  • python使用selenium,实现简单爬虫功能
  • 《从C/C++到Java入门指南》- 22.对象的转型
  • 机器学习面试题(9月3日笔记)
  • 跨境多账号登录如何防止IP、cookie和设备关联?
  • pil 常见用法
  • 如何打造在线音乐网站?java springboot架构,vue前端开发,音乐分享新体验
  • sealos快速搭建k8s集群
  • 记录 PyQt6 / PySide 6 自定义边框窗口的 Bug 及可能可行的解决方案:窗口抖动和添加 DWM 环绕阴影的大致原理
  • Java的IO模型详解-BIO,NIO,AIO
  • 常见接口限流算法
  • 4. 第一个3D案例—创建3D场景
  • idea中git提交或push到远程后回退到之前的某次提交简单有效的解决方案
  • go语言的闭包
  • gitea + drone实现CI/CD
  • 浅谈新能源汽车充电桩安装以及防范
  • Java中的类加载过程
  • 关于武汉高芯coin417G2红外机芯的二次开发
  • AFFiNE简介
  • 代码随想录八股训练营第三十二天| C++
  • SQL 编程基础