通过MCP连接 →

输入计算

数学公式

广告

结果

CRC 校验和(十六进制)
0x29B1
16-bit checksum
十进制值 10,673
位宽 16 bits
已处理字节数 9

什么是 CRC 校验和?

循环冗余校验(Cyclic Redundancy Check,简称 CRC)是一种广泛应用于网络通信、数据存储和文件格式中的错误检测编码,比如以太网、ZIP、PNG、Modbus、USB 等场景都会用到它。CRC 把待校验的数据看作一个很长的二进制数,再用一个固定的生成多项式对它做无进位的二进制除法(即 \(\mathrm{GF}(2)\) 运算,其中加法和减法都等同于异或 XOR)。这次除法得到的余数就是 CRC 值。哪怕原始数据中只有一个比特发生改变,余数几乎一定也会跟着变化——正是这一特性让 CRC 在检测传输和存储错误方面表现出色。

将报文拆分为数据和附加的 CRC 校验和字段的框图
CRC 会在数据后附加一个简短的校验值,以便检测错误。

如何使用本计算器

在输入框中键入任意 ASCII 文本,选择你需要的 CRC 变体,即可读取结果。工具会同时给出十六进制和十进制两种形式的校验和,并显示位宽以及处理的字节数。本工具支持以下三种常见变体:

$$\text{CRC}_{8} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b) \\[1.5em] \text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0x00} \\ \text{poly} &= \mathtt{0x07} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 8 \text{ bits, MSB-first} \end{aligned} \right.$$ $$\text{CRC}_{16} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b) \\[1.5em] \text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFF} \\ \text{poly} &= \mathtt{0x1021} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 16 \text{ bits, MSB-first} \end{aligned} \right.$$ $$\text{CRC}_{32} = \mathtt{0xFFFFFFFF} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b) \\[1.5em] \text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFFFFFF} \\ \text{poly} &= \mathtt{0xEDB88320}\ (\text{reflected}) \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \gg 1\big) \oplus (\text{LSB}?\,\text{poly}:0) \\ \text{width} &= 32 \text{ bits, LSB-first} \end{aligned} \right.$$

CRC-8 —— 多项式 \(\mathtt{0x07}\),初始值 \(\mathtt{0x00}\)。
CRC-16/CCITT-FALSE —— 多项式 \(\mathtt{0x1021}\),初始值 \(\mathtt{0xFFFF}\),不做位反射。
CRC-32(IEEE 802.3) —— 反射多项式 \(\mathtt{0xEDB88320}\),初始值 \(\mathtt{0xFFFFFFFF}\),最终异或 \(\mathtt{0xFFFFFFFF}\)。这正是 ZIP、gzip 和以太网所采用的变体。

计算原理详解

从概念上看,就是先把消息 \(M(x)\) 乘以 \(x^n\)(\(n\) 为生成多项式的次数),再除以 \(G(x)\)。在实际实现中,我们使用一个寄存器,每次移动一个比特,当最高位为 1 时就把多项式异或进去。对于反射型变体(例如 CRC-32),则是从最低有效位开始逐位处理,并采用右移而非左移。

$$\text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b) \\[1.5em] \text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right.$$
在 GF(2) 上使用异或步骤将报文比特除以生成多项式的多项式长除法
CRC 是报文对生成多项式 \(G(x)\) 进行二进制多项式除法(异或)的余数。

实例演算

以经典的校验字符串 123456789 为例:CRC-16/CCITT-FALSE 得到 0x29B1(十进制 \(10673\)),CRC-32/IEEE 得到 0xCBF43926(十进制 \(3421780262\))。这些都是 CRC 参考目录中公布的标准"校验"值,因此你可以拿它们来验证任何实现是否正确。

常见问题

为什么我的结果和别的工具不一样?不同的 CRC 变体在多项式、初始值、位反射以及最终异或上各有差异。请确认你比对的是完全相同的变体。

CRC 算是安全的哈希吗?不算。CRC 能检测无意产生的错误,但极易被人为伪造。若用于安全场景,请改用 SHA-256 之类的算法。

采用什么编码?在计算 CRC 之前,每个字符都会被取作其 8 位的 ASCII/Latin-1 字节值。

最后更新: