首页 > 其他分享 >CRC校验与ChekSum的概念与应用

CRC校验与ChekSum的概念与应用

时间:2024-10-29 17:16:50浏览次数:9  
标签:错误 检测 校验 CRC Checksum 数据 ChekSum

CRC(Cyclic Redundancy Check,循环冗余校验)Checksum(校验和)是两种常用的数据完整性校验方法,主要用于检测在数据传输或存储过程中发生的错误。尽管它们的目的相似,但它们的计算方式和应用场景有所不同。

1. CRC(循环冗余校验)

概念

CRC 是一种基于二进制除法的错误检测码。它将数据视为多项式,通过特定的生成多项式进行模二除法,产生的余数即为CRC校验码。CRC 的核心思想是将整个数据块通过数学算法生成一个固定长度的校验值,然后在接收端使用相同的算法计算校验值来检测数据的完整性。

计算过程
  1. 选择一个生成多项式(通常根据应用标准选择)。
  2. 将数据块与生成多项式做模二除法。
  3. 余数即为CRC校验码,附加在原始数据后发送。
  4. 接收端用相同的生成多项式对接收到的数据再次进行除法运算,如果余数为零,则认为数据没有发生错误。
应用场景
  • 网络通信:如以太网、串口通信协议、Wi-Fi 数据帧等。
  • 存储设备:硬盘、磁带等数据存储介质的数据校验。
  • 嵌入式系统:常用于校验固件或数据的完整性。
优点
  • 检测能力强,特别是对于偶数个比特错误非常敏感。
  • 可以检测多种类型的错误,包括单比特错误、双比特错误、奇数位翻转等。
缺点
  • 相对复杂,计算开销较大,特别是对于硬件或实时性要求较高的应用。

CRC 校验示例

假设我们有一组8位二进制数据 11010101,采用生成多项式 1011(对应CRC-3),我们用CRC校验验证数据完整性。

步骤
  1. 原始数据: 11010101

  2. 生成多项式: 1011(长度为3位)

  3. 附加0: 在数据末尾添加3位0,变为 11010101000

  4. 模二除法计算CRC余数:

    • 按照多项式 101111010101000 进行模二除法计算。
    • 计算过程(仅关键步骤):
      1. 11011011 进行异或操作:得 0110
      2. 0110 的后续部分 110 放下再异或 1011 继续运算,依此类推直到完成。
    • 最终得到CRC余数为 111
  5. CRC 校验码: 111,附加在原始数据之后得到 11010101111

  6. 校验过程: 在接收端,重新进行模二除法运算,如果余数为 0,则数据无误;否则数据有误。

2. Checksum(校验和)

概念

Checksum 是一种简单的校验机制,通过对数据块中的所有字节或位进行累加得到一个总和,然后对这个总和进行一定的处理(如取模)生成校验值。它通常用于检测数据传输过程中的简单错误。

计算过程
  1. 将数据块的所有字节加起来(有时会分组累加,例如16位或32位累加)。
  2. 对累加的结果取模(如模256、模65536等)。
  3. 余数作为Checksum附加在数据后面发送。
  4. 接收端将接收到的数据进行相同的累加和模运算,校验结果是否一致。
应用场景
  • 文件传输:如FTP、HTTP协议中的数据校验。
  • 数据存储:如ZIP、RAR等压缩文件的完整性校验。
  • 嵌入式系统:简单系统中的数据校验或通讯协议中常见。
优点
  • 实现简单,计算快速,适用于轻量级场景。
  • 对偶然发生的错误(如单个比特翻转)具有一定的检测能力。
缺点
  • 检测能力较弱,无法检测某些复杂的错误模式(如位翻转顺序改变或多比特错误)。
  • 对某些特定的错误(如数值交换、位对调等)无法检测。

Checksum 校验示例

假设我们有一组 ASCII 字符串数据 "ABCD",我们计算其 8 位校验和。

步骤
  1. 原始数据: "ABCD"

  2. ASCII 转换:将每个字符转换为 ASCII 码:

    • 'A' -> 65
    • 'B' -> 66
    • 'C' -> 67
    • 'D' -> 68
  3. 求和:65 + 66 + 67 + 68 = 266

  4. 模运算:将结果对 256 取模(通常取 8 位),得 266 % 256 = 10

  5. 校验和:10,附加在数据后作为校验和值,传输时发送原始数据 "ABCD" 和校验和 10

  6. 校验过程:接收端同样将收到的 "ABCD" 转为 ASCII 码并求和,如果和校验和匹配则数据无误,否则有误。

 CRC 与 Checksum 的对比

特性

CRC

Checksum

计算复杂度较高(基于多项式除法)较低(基于简单的加法)
错误检测能力强,特别是偶数个比特错误弱,主要检测单比特错误
应用场景网络通信、存储设备文件传输、轻量级数据校验
实现难度复杂,常需硬件加速简单,容易在软件中实现

总结

  • CRC 更适合在高可靠性要求的场景下使用,如网络协议、数据传输等。它能检测多种类型的错误,并且对于数据纠错也有一定帮助。
  • Checksum 适合对性能要求较高,但错误检测要求不高的场景。它的计算简单,但错误检测能力较弱。

标签:错误,检测,校验,CRC,Checksum,数据,ChekSum
From: https://blog.csdn.net/kuixiang_yin/article/details/143232848

相关文章

  • 【揭秘】如何用ConstraintValidator自定义校验注解,让你的代码更简洁高效!
    在Java中,自定义校验注解(CustomValidationAnnotation)通常用于BeanValidation框架(如HibernateValidator),以便对特定字段或方法参数进行验证。以下是如何创建和使用自定义校验注解的详细步骤和代码示例:1.定义自定义校验注解首先,我们需要定义一个自定义校验注解。这个注解需......
  • CRC16
    CRC16算法循环冗余算法/***循环冗余校验算法**代码中的常量,仅用于提示相关算法,无实际功能**@authorMr.css*@version2024-10-2210:49*/publicclassCRC16Utils{/***名称:CRC4多项式:x4+x+1简记式:3*/publicstaticfinalintC......
  • MinIO上传和下载文件及文件完整性校验.
    MinIO上传和下载文件及文件完整性校验.packagecom.xuecheng.media;importcom.j256.simplemagic.ContentInfo;importcom.j256.simplemagic.ContentInfoUtil;importio.minio.*;importio.minio.errors.*;importorg.apache.commons.codec.digest.DigestUtils;importorg......
  • CCRC-DSO数据安全官能力培养及课程特色
    在当今数字化高速发展的时代,培养六大能力以确保数据安全意识至关重要。首先,树立安全观并提高安全意识是基石。若在工作中方式、方法不当,可能会引发一系列严重后果。例如,在某些企业中,员工因疏忽大意将未加密的重要数据存储在公共云盘上,导致数据泄露,给企业带来巨大的经济损失和声......
  • mac scrcpy 报错 does not exist or is not a regular file,ERROR: Server connection
    scrcpymac与极空间冲突问题:➜~scrcpyscrcpy2.7<https://github.com/Genymobile/scrcpy>INFO:ADBdevicefound:INFO:-->(usb)8AJY0LU0QdevicePixel_3_XLstat:NosuchfileordirectoryERROR:'/Applications/极空间.ap......
  • CRC32爆破脚本 + [MoeCTF 2022]cccrrc 题解
    CRC32爆破原理介绍:CRC(循环冗余校验)是一种用于检测数据传输错误的技术。CRC算法生成一个校验值(校验和),这个值可以附加到数据后面,在数据接收方重新计算校验值并与附加的校验值进行比较,以此来确定数据是否在传输过程中发生了错误CRC32是一种常用的CRC算法,它的校验值长度固定为3......
  • 分享一个开源的文件MD5、Hash值等校验的小工具
    官方主页https://github.com/dragonyee/MyHash软件截图介绍一款采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。功能特点:1、只支持常用的CRC32、MD5、SHA1、SHA256、SHA512算法;2、支持多核CPU并行计算,大幅提高计算速度;3、支持多个文件或文件夹拖放操作;4、支......
  • 三周精通FastAPI:6 路径参数和数值校验
    路径参数和数值校验¶与使用 Query 为查询参数声明更多的校验和元数据的方式相同,你也可以使用 Path 为路径参数声明相同类型的校验和元数据。导入路径Path¶首先,从 fastapi 导入 Path:fromtypingimportAnnotatedfromfastapiimportFastAPI,Path,Querya......
  • iOS - Swift 正则校验场景总结
    1.校验是否只含有“数字和字母”或者“字母”classfunccheckUserName(_username:String)->Bool{    letregex=try?NSRegularExpression(pattern:"^(?![0-9]+$)[0-9A-Za-z]{8,16}$",options:[])    returnregex?.firstMatch(in:usernam......