CRC-32 / ISO-HDLC
PKZip · PNG · Ethernet
最常见的 CRC-32 实现,也称 CRC-32b。使用多项式 0x04C11DB7 的比特反射形式 0xEDB88320,输入字节与输出结果均做位反射(LSB first),初始值与最终异或值均为 0xFFFFFFFF。
广泛用于 ZIP、gzip、PNG 图片、以太网帧校验(IEEE 802.3)、PKCS#7 等,是事实上的"默认 CRC-32"。
| 多项式 | 0x04C11DB7(正常)/ 0xEDB88320(反射) |
| 初始值 | 0xFFFFFFFF |
| 输入反射 | 是(RefIn = true) |
| 输出反射 | 是(RefOut = true) |
| 最终异或 | 0xFFFFFFFF |
| 校验值 | 0xCBF43926(对 "123456789") |
CRC-32C / Castagnoli
iSCSI · NVMe · SCTP
由 G. Castagnoli 等人于 1993 年提出,采用多项式 0x1EDC6F41(反射形式 0x82F63B78)。在相同 Hamming 距离下比 ISO-HDLC 多项式具有更优秀的突发错误检测能力。
Intel SSE4.2 与 ARM CRC32 指令集均提供硬件加速,现代存储协议(iSCSI、NVMe、Btrfs、SCTP)广泛采用。
| 多项式 | 0x1EDC6F41(正常)/ 0x82F63B78(反射) |
| 初始值 | 0xFFFFFFFF |
| 输入反射 | 是(RefIn = true) |
| 输出反射 | 是(RefOut = true) |
| 最终异或 | 0xFFFFFFFF |
| 校验值 | 0xE3069283(对 "123456789") |
CRC-32 / MPEG-2
MPEG-2 · DVB · ATSC
使用与 ISO-HDLC 相同的多项式 0x04C11DB7,但输入和输出均不做位反射(MSB first,大端序),初始值 0xFFFFFFFF,最终不做异或(XorOut = 0x00000000)。
主要用于 MPEG-2 传输流(TS)的 PSI/SI 表格(PAT、PMT、NIT 等),以及 DVB、ATSC 广播系统的帧完整性校验。
| 多项式 | 0x04C11DB7 |
| 初始值 | 0xFFFFFFFF |
| 输入反射 | 否(RefIn = false) |
| 输出反射 | 否(RefOut = false) |
| 最终异或 | 0x00000000(不异或) |
| 校验值 | 0x0376E6E7(对 "123456789") |
CRC-32 / BZIP2
BZip2 · AAL5 · DECT
参数与 MPEG-2 几乎相同(多项式 0x04C11DB7,不反射,初值 0xFFFFFFFF),唯一区别是最终结果与 0xFFFFFFFF 异或(即对所有位取反),也称 CRC-32/AAL5 或 CRC-32/DECT-B。
用于 BZip2 压缩文件格式及 ATM AAL5 协议的帧尾部校验字段。
| 多项式 | 0x04C11DB7 |
| 初始值 | 0xFFFFFFFF |
| 输入反射 | 否(RefIn = false) |
| 输出反射 | 否(RefOut = false) |
| 最终异或 | 0xFFFFFFFF |
| 校验值 | 0xFC891918(对 "123456789") |
UTF-8 文本
默认 · 通用
将输入框中的字符串按 UTF-8 编码转换为字节序列,再计算 CRC32。这是最常用的模式,适合对普通文本、程序源码、JSON 等内容校验。
注意:同一段文字若采用不同字符编码(如 GBK、UTF-16),所得字节流不同,CRC32 结果也会不同。本工具固定使用 UTF-8。
| 适用场景 | 普通文字、源代码、JSON、XML |
| 示例 | "Hello" → 48 65 6C 6C 6F(5 bytes) |
| 中文字符 | 每个汉字占 3 bytes(UTF-8) |
Hex 十六进制
二进制数据 · 协议报文
将输入视为十六进制字节字面量直接解析为原始字节,忽略空格/换行。每两个十六进制字符对应一个字节(00–FF)。
适用于需要对特定二进制数据(如网络帧、固件镜像片段、内存 dump)精确计算 CRC 的场景,可直接粘贴 Wireshark/hex dump 输出。
| 格式要求 | 仅允许 0-9 和 a-f / A-F |
| 字符数 | 必须为偶数(每字节 2 个字符) |
| 示例 | 48656C6C6F = "Hello"(5 bytes) |
| 空格处理 | 自动忽略,48 65 6C 等同 48656C |
Base64
编码二进制 · 证书 · 图片
将输入视为 Base64 编码字符串,先解码为原始二进制字节再计算 CRC32。常见于对 PEM 证书、JWT payload、Data URI(图片/文件)等 Base64 编码内容直接校验的场景。
支持标准 Base64 字符集(A-Z a-z 0-9 + /),填充字符 = 可选。不支持 URL-safe Base64(- _)。
| 字符集 | A-Z a-z 0-9 + / = |
| 示例 | SGVsbG8= → "Hello"(5 bytes) |
| URL-safe | 不支持,请先替换 -→+ _→/ |
| ⚠ 1 个字符 | 无效 — 6 bits 不足以凑成 1 字节(需要 8 bits) |
| 2 个字符 | 解码出 1 字节(最小合法输入) |
| 3 个字符 | 解码出 2 字节 |
| 4 个字符 | 解码出 3 字节(每 4 字符为一组循环) |
十六进制 Hex
最常用 · 默认
以 0x 前缀的 8 位十六进制数表示(大写),每个字符代表 4 bits,共 32 bits。这是绝大多数工具、文档、源代码中记录 CRC32 值的标准格式。
与十进制相比,十六进制能直观体现字节边界,便于对照内存 dump、协议字段。
| 示例 | 0xCBF43926 |
| 位数 | 8 个十六进制字符 = 32 bits |
| 进制 | 16 进制(0-9, A-F) |
| 适用 | 代码、文档、Wireshark、hex editor |
十进制 Decimal
无符号 32 位整数
以无符号 32 位十进制整数表示,范围 0 – 4,294,967,295(2³²−1)。部分编程语言(Python、Java)在比较 CRC 时使用十进制整数,数据库字段也常存储十进制。
注意:CRC32 结果应视为无符号整数。在 Java/C# 的 int(有符号)中,超过 0x7FFFFFFF 的值会显示为负数,需强制转换为 uint。
| 示例 | 3421780262 |
| 范围 | 0 – 4,294,967,295 |
| 注意 | Java int 需 & 0xFFFFFFFFL 转换 |
| 适用 | 数据库、Python struct、比较运算 |
二进制 Binary
位级分析
以 0b 前缀的 32 位二进制字符串表示,每个字符为 0 或 1,左侧高位(MSB)对齐,不足 32 位则左侧补零。
主要用于理解 CRC 算法内部结构、分析多项式除法步骤、教学演示,以及嵌入式系统中需要逐位处理校验码的场景。
| 示例 | 0b11001011…00100110 |
| 位数 | 固定 32 位,左补零 |
| 最高位 | 位 31(MSB)在最左侧 |
| 适用 | 算法分析、教学、嵌入式调试 |
八进制 Octal
Unix · 文件系统
以 0o 前缀的 11 位八进制数表示(32 bits 最多需要 11 位八进制字符,因为 3×11 = 33 > 32)。每个八进制字符代表 3 bits。
在现代 CRC 校验中八进制较少使用,但在部分 Unix 工具(cksum 早期实现)、嵌入式固件工具链及某些旧版通信协议规范中仍有记录。
| 示例 | 0o31572031046 |
| 位数 | 最多 11 位八进制字符 |
| 每字符 | 表示 3 bits(0-7) |
| 适用 | Unix 工具、旧版协议规范 |