CodeKitHub
编码工具

CRC 校验计算器

最后更新:

CRC(循环冗余校验)是一种从数据块中通过二进制域上的多项式除法计算得到的短小、固定长度的校验值——它的作用是发现数据的意外损坏,而不是防止蓄意篡改。本计算器完全在你的浏览器中使用标准的基于查表的 CRC 算法进行计算:粘贴文本或上传一个小文件,选择 CRC-32(zip、PNG 和以太网使用的 IEEE 802.3 多项式 0xEDB88320)、CRC-16/CCITT-FALSE 或 CRC-16/MODBUS,即可立即获得十六进制、十进制和二进制形式的结果。你输入的任何内容都不会发送到服务器。

十六进制
十进制
二进制

工具介绍

CRC 全称为 Cyclic Redundancy Check(循环冗余校验),是一种纠错检测码,最早在 W. Wesley Peterson 和 D.T. Brown 于 1975 年发表的论文中被描述,后来在 Ross Williams 的《A Painless Guide to CRC Error Detection Algorithms》 以及 ITU-T / ISO 3309 标准等参考资料中被正式规范化。CRC 将一条消息视为一个大的二进制数,并用一个固定的生成多项式去除它;这次除法的余数就是校验值。由于多项式除法在硬件和软件中计算成本都很低,CRC 已成为存储和传输系统中默认的错误校验方式。

CRC-32——具体来说是多项式为 0xEDB88320、初始值为 0xFFFFFFFF、最终异或值为 0xFFFFFFFF 的这一变体——已在 IEEE 802.3(以太网)中标准化,并被用作 ZIP 和 gzip 压缩包、PNG 图像文件以及众多网络和存储协议内部的校验值。它是被请求最多的 CRC 变体,这也是本工具将其设为默认算法的原因。CRC-16/CCITT-FALSE(多项式 0x1021)和 CRC-16/MODBUS(多项式 0x8005,反转形式)是两种广泛使用的 16 位变体,常见于 Modbus RTU、XMODEM 等串行协议以及各种嵌入式/工业通信标准中。

理解 CRC 不是什么同样重要:它不是密码学哈希函数。CRC 是快速的线性函数,对蓄意操纵没有任何抵抗力——构造出另一条产生相同 CRC 值的消息是很容易做到的。它们非常擅长捕捉由噪声传输线路、磁盘错误或下载中断等原因造成的随机比特翻转,但对于想要在不被察觉的情况下篡改数据的攻击者,CRC 完全无法提供保护。

为什么使用它?

  • 调试 Modbus RTU 驱动时,从机一直拒收你发的帧——把确切的字节序列粘贴进来,选择 CRC-16/MODBUS,先确认固件里的 CRC 例程算出来的值和参考值一致,再去排查其他环节。
  • 刚用 C 或 Rust 从零手写了一个 CRC-32 查表实现,想先做个基本校验——用标准测试字符串“123456789”跑一遍,确认结果是 0xCBF43926,再放心用它处理真实数据。
  • 某个 ZIP 解压工具在某个条目上报了 CRC 不匹配的错误,不确定压缩包是不是真的损坏了——把解压出来的字节重新计算一次 CRC-32,和 ZIP 本地文件头里存储的值做对比。
  • 在实现 XMODEM 或类似的串口协议,文档只写了一句“在末尾附加 CRC-16”没有更多细节——先在这里算出正确值,心里有数之后再去调试发送端代码。
  • 接手一个嵌入式老项目,校验字段没有文档说明,怀疑用的是 CRC-16/CCITT-FALSE 而不是 CRC-16/MODBUS——用同一段已知数据分别试两种变体,看哪个和设备实际发出的值对得上。
  • 100% 本地运行:你的文本或文件完全在浏览器中通过 JavaScript 处理,不会上传到任何地方。

使用方法

  1. 选择“Text”标签页并粘贴或输入你的内容,或切换到“File”标签页并从设备中选择一个文件。
  2. 选择 CRC 算法:CRC-32(IEEE 802.3,默认且最常用)、CRC-16/CCITT-FALSE 或 CRC-16/MODBUS。
  3. 校验值会自动更新,以十六进制、十进制和二进制形式显示。
  4. 点击任意结果旁边的“Copy”即可将其复制到剪贴板。

示例

输入

123456789

输出

0xCBF43926 (3421780262)

这是标准公开发布的 CRC-32(IEEE 802.3)测试向量:ASCII 字符串“123456789”的 CRC-32 值始终为 0xCBF43926。你可以用这个字符串来对照本工具的输出与任何其他正确的 CRC-32 实现。

CRC 与密码学哈希(MD5 / SHA)的区别

CRC 和密码学哈希都将数据压缩为固定大小的指纹,但它们解决的问题不同,不能互相替代。

属性CRC(如 CRC-32)MD5 / SHA-256
目的检测意外损坏检测蓄意篡改 / 验证完整性
速度极快,硬件/软件实现简单较慢,每字节需要更多计算
抗碰撞性无——可轻易蓄意构造碰撞设计为计算上不可行(SHA-256),或已被攻破(MD5)
典型长度16 或 32 位128 位(MD5)或 256 位(SHA-256)
常见用途ZIP/gzip、PNG、以太网、Modbus、存储文件完整性校验、数字签名、密码存储(配合加盐)

三种 CRC 变体一览

每种变体都由多项式、初始值、输入/输出是否反转,以及最终异或值这几个参数共同定义——只要其中一项对不上,算出来的校验值虽然“技术上有效”,但和目标系统并不兼容。

变体多项式初始值是否反转最终异或值常见用途
CRC-32(IEEE 802.3)0xEDB883200xFFFFFFFF是(输入和输出)0xFFFFFFFFZIP、gzip、PNG、以太网
CRC-16/CCITT-FALSE0x10210xFFFF0x0000XMODEM、电信类协议
CRC-16/MODBUS0x80050xFFFF是(输入和输出)0x0000Modbus RTU 串行帧

相关工具

如果你需要的是密码学校验值而不是纠错用的 CRC,以下工具更适合你。

多算法哈希生成器 · MD5 生成器 · HMAC 生成器

常见问题

CRC 有什么用途?

CRC(循环冗余校验)是附加在数据块后面的一种错误检测码,接收方可以重新计算它,以确认数据在存储或传输过程中没有意外损坏。它被内置于 IEEE 802.3 以太网帧、ZIP 和 gzip 文件格式、PNG 图像以及许多串行和工业协议(如 Modbus)等标准中。

CRC-32 和 MD5 或 SHA-256 一样吗?

不一样。CRC-32 是一种快速、线性的错误检测校验值,不具备任何安全属性——蓄意构造两个具有相同 CRC-32 值的不同输入是很简单的事情。MD5 和 SHA-256 是密码学哈希函数,其设计目的是让这种蓄意的碰撞在计算上不可行。使用 CRC-32 来捕捉意外损坏(如磁盘划伤、网络丢包);当你需要防篡改证明或需要抵御攻击者的完整性保证时,请使用我们的 [Hash Generator](/hash-generator) 或 [MD5 Generator](/md5-generator) 提供的密码学哈希。

本工具使用的是哪种 CRC-32 变体?

IEEE 802.3 / ZIP / PNG 变体:多项式 0xEDB88320(0x04C11DB7 的比特反转形式),初始值 0xFFFFFFFF,输入和输出都进行反转,最终异或值为 0xFFFFFFFF。这是以太网、ZIP、gzip 和 PNG 所使用的变体,也是对 ASCII 字符串“123456789”产生 0xCBF43926 的变体——这是用于验证 CRC-32 实现的标准公开测试向量。

CRC-16/CCITT-FALSE 和 CRC-16/MODBUS 有什么区别?

两者都是 16 位 CRC,但多项式和参数不同。CRC-16/CCITT-FALSE 使用多项式 0x1021,初始值为 0xFFFF,不进行比特反转;它常见于 XMODEM 等协议以及各种电信标准中。CRC-16/MODBUS 使用多项式 0x8005(反转后为 0xA001),同样以 0xFFFF 为初始值,但输入和输出都进行反转——这是 Modbus RTU 附加到每个串行帧末尾的校验值。对于相同的输入,两者会产生不同的结果,因此选择目标协议实际规定的变体非常重要。

我可以计算文件的 CRC,而不只是文本吗?

可以。切换到“File”标签页并从设备中选择一个文件——本工具会在浏览器本地(通过 File API)读取其原始字节,并针对这些确切的字节计算校验值,与 ZIP 或 PNG 读取器的做法完全相同。

我的数据会被上传到服务器吗?

不会。文本和文件的计算都完全在客户端使用 JavaScript 运行,采用标准的基于查表的 CRC 算法。你输入或上传的任何内容都不会离开你的浏览器。

为什么我自己写的 CRC-32 实现算出来的结果和这个工具不一样?

最常见的原因是初始值、最终异或值或比特反转设置没对上——CRC-32 并不是单一固定算法,而是一族参数组合,本工具使用的 IEEE 802.3 / ZIP / PNG 变体以 0xFFFFFFFF 作为初始值,输入和输出都进行反转,最终再与 0xFFFFFFFF 异或。少做其中任何一步,都会得到一个技术上“合法”但互不兼容的校验值。可以用“123456789” → 0xCBF43926 这个测试向量来定位到底是哪一步出了问题。

上传文件有大小限制吗?

工具本身没有人为设置限制,但由于 CRC 是在浏览器里用 JavaScript 逐字节计算的,非常大的文件可能会比较慢。对于常见的固件镜像、ZIP 条目或协议帧(从几个字节到几十兆字节),计算速度基本是即时的。

粘贴文本时,空白字符或换行符风格会影响 CRC 结果吗?

会——CRC 是针对输入的确切字节计算的,所以末尾多一个换行符、多一个空格,或者 Windows 风格的 CRLF 和 Unix 风格的 LF 换行符,都会得出不同的校验值,即使肉眼看起来文本内容一样。如果要对照另一个工具算出的校验值,请粘贴该工具实际处理的完全相同内容(包括末尾空白),或者更保险的做法是切换到“File”标签页直接比对原始字节。

两个完全不同的文件会不会算出相同的 CRC-32 值?

会,而且这是正常现象,不是 bug——CRC-32 只有 2^32 种可能的输出值,对于足够大的数据集合,从数学上讲碰撞是必然存在的,而且由于 CRC-32 不具备密码学意义上的抗碰撞性,蓄意构造出碰撞也非常容易。这正是为什么 CRC-32 适合捕捉意外损坏,但不适合用来验证文件是否被篡改过。

如果协议文档没有说明具体参数,应该选哪种 CRC 变体?

先从该协议家族最常关联的变体试起:Modbus RTU 串行通信用 CRC-16/MODBUS,XMODEM 以及许多源自电信标准的协议用 CRC-16/CCITT-FALSE,任何和 ZIP、gzip、PNG 或以太网相关的场景用 CRC-32(IEEE 802.3 变体)。如果拿真实设备的已知正确帧去对比,两种都对不上,那这个协议可能用的是本工具未覆盖的非标准多项式或参数组合。

相关工具