Skip to content

CRC校验计算器(循环冗余校验)

CRC校验在线计算:粘贴十六进制或文本,一次算出 CRC-8/16/32 共 63 个变体,含 CRC16 Modbus。设备返回的值对不上时填进反查框,直接告诉你是哪个变体——MODBUS、CCITT-FALSE、XMODEM、KERMIT。全程浏览器本地计算。

无追踪 浏览器中运行 免费
全部计算都在你的浏览器本地完成——你粘贴的数据不会离开这台设备。
试试这些

CRC 全部 63 个变体的计算结果与参数

每一行都随你的输入实时重算。
变体 结果 多项式 初始值 输入/输出反转 最终异或
CRC-8
CRC-8/AUTOSAR 0x2F 0xFF false / false 0xFF
CRC-8/BLUETOOTH 0xA7 0x00 true / true 0x00
CRC-8/CDMA2000 0x9B 0xFF false / false 0x00
CRC-8/DARC 0x39 0x00 true / true 0x00
CRC-8/DVB-S2 0xD5 0x00 false / false 0x00
CRC-8/GSM-A 0x1D 0x00 false / false 0x00
CRC-8/GSM-B 0x49 0x00 false / false 0xFF
CRC-8/HITAG 0x1D 0xFF false / false 0x00
CRC-8/I-432-1 CRC-8/ITU 0x07 0x00 false / false 0x55
CRC-8/I-CODE 0x1D 0xFD false / false 0x00
CRC-8/LTE 0x9B 0x00 false / false 0x00
CRC-8/MAXIM-DOW CRC-8/MAXIM · DOW-CRC 0x31 0x00 true / true 0x00
CRC-8/MIFARE-MAD 0x1D 0xC7 false / false 0x00
CRC-8/NRSC-5 0x31 0xFF false / false 0x00
CRC-8/OPENSAFETY 0x2F 0x00 false / false 0x00
CRC-8/ROHC 0x07 0xFF true / true 0x00
CRC-8/SAE-J1850 CRC-8/J1850 0x1D 0xFF false / false 0xFF
CRC-8/SMBUS CRC-8 0x07 0x00 false / false 0x00
CRC-8/TECH-3250 CRC-8/AES · CRC-8/EBU 0x1D 0xFF true / true 0x00
CRC-8/WCDMA 0x9B 0x00 true / true 0x00
CRC-16
CRC-16/ARC CRC-16 · CRC-16/IBM · CRC-16/LHA 0x8005 0x0000 true / true 0x0000
CRC-16/CDMA2000 0xC867 0xFFFF false / false 0x0000
CRC-16/CMS 0x8005 0xFFFF false / false 0x0000
CRC-16/DDS-110 0x8005 0x800D false / false 0x0000
CRC-16/DECT-R R-CRC-16 0x0589 0x0000 false / false 0x0001
CRC-16/DECT-X X-CRC-16 0x0589 0x0000 false / false 0x0000
CRC-16/DNP 0x3D65 0x0000 true / true 0xFFFF
CRC-16/EN-13757 0x3D65 0x0000 false / false 0xFFFF
CRC-16/GENIBUS CRC-16/DARC · CRC-16/EPC · CRC-16/EPC-C1G2 · CRC-16/I-CODE 0x1021 0xFFFF false / false 0xFFFF
CRC-16/GSM 0x1021 0x0000 false / false 0xFFFF
CRC-16/IBM-3740 CRC-16/CCITT-FALSE · CRC-16/AUTOSAR 0x1021 0xFFFF false / false 0x0000
CRC-16/IBM-SDLC CRC-16/X-25 · CRC-16/X25 · CRC-16/ISO-HDLC · CRC-B · X-25 0x1021 0xFFFF true / true 0xFFFF
CRC-16/ISO-IEC-14443-3-A CRC-A 0x1021 0xC6C6 true / true 0x0000
CRC-16/KERMIT CRC-16/CCITT · CRC-16/CCITT-TRUE · CRC-16/V-41-LSB · CRC-CCITT 0x1021 0x0000 true / true 0x0000
CRC-16/LJ1200 0x6F63 0x0000 false / false 0x0000
CRC-16/M17 0x5935 0xFFFF false / false 0x0000
CRC-16/MAXIM-DOW CRC-16/MAXIM 0x8005 0x0000 true / true 0xFFFF
CRC-16/MCRF4XX 0x1021 0xFFFF true / true 0x0000
CRC-16/MODBUS 0x8005 0xFFFF true / true 0x0000
CRC-16/NRSC-5 0x080B 0xFFFF true / true 0x0000
CRC-16/OPENSAFETY-A 0x5935 0x0000 false / false 0x0000
CRC-16/OPENSAFETY-B 0x755B 0x0000 false / false 0x0000
CRC-16/PROFIBUS CRC-16/IEC-61158-2 0x1DCF 0xFFFF false / false 0xFFFF
CRC-16/RIELLO 0x1021 0xB2AA true / true 0x0000
CRC-16/SPI-FUJITSU CRC-16/AUG-CCITT 0x1021 0x1D0F false / false 0x0000
CRC-16/T10-DIF 0x8BB7 0x0000 false / false 0x0000
CRC-16/TELEDISK 0xA097 0x0000 false / false 0x0000
CRC-16/TMS37157 0x1021 0x89EC true / true 0x0000
CRC-16/UMTS CRC-16/BUYPASS · CRC-16/VERIFONE 0x8005 0x0000 false / false 0x0000
CRC-16/USB 0x8005 0xFFFF true / true 0xFFFF
CRC-16/XMODEM CRC-16/ACORN · CRC-16/LTE · CRC-16/V-41-MSB · ZMODEM 0x1021 0x0000 false / false 0x0000
CRC-32
CRC-32/AIXM CRC-32Q 0x814141AB 0x00000000 false / false 0x00000000
CRC-32/AUTOSAR 0xF4ACFB13 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/BASE91-D CRC-32D 0xA833982B 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/BZIP2 CRC-32/AAL5 · CRC-32/DECT-B · B-CRC-32 0x04C11DB7 0xFFFFFFFF false / false 0xFFFFFFFF
CRC-32/CD-ROM-EDC 0x8001801B 0x00000000 true / true 0x00000000
CRC-32/CKSUM CRC-32/POSIX 0x04C11DB7 0x00000000 false / false 0xFFFFFFFF
CRC-32/ISCSI CRC-32C · CRC-32/BASE91-C · CRC-32/CASTAGNOLI · CRC-32/INTERLAKEN 0x1EDC6F41 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/ISO-HDLC CRC-32 · CRC-32/ADCCP · CRC-32/V-42 · CRC-32/XZ · PKZIP 0x04C11DB7 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/JAMCRC 0x04C11DB7 0xFFFFFFFF true / true 0x00000000
CRC-32/MEF 0x741B8CD7 0xFFFFFFFF true / true 0x00000000
CRC-32/MPEG-2 0x04C11DB7 0xFFFFFFFF false / false 0x00000000
CRC-32/XFER 0x000000AF 0x00000000 false / false 0x00000000
自定义参数

当你的设备文档给出的多项式不在上表中时使用。

结果
全部 63 组变体参数都在测试套件中对照其公布的目录自检值做了断言,CRC-32/ISO-HDLC 另以 Node 内置的 zlib.crc32 作为独立参照交叉校验。 — Go Tools 团队 · 2026年9月6日

由 Go Tools 工程团队构建并验证。

CRC 速查答案

123456789 的 CRC-32

0xCBF43926 CRC-32/ISO-HDLC 为 0xCBF43926,也就是 ZIP、PNG、以太网和 gzip 用的那个变体。

123456789 的 CRC-16/MODBUS

0x4B37 0x4B37,参数为 poly 0x8005、init 0xFFFF、输入输出反转、无最终异或。

123456789 的 CRC-16/CCITT-FALSE

0x29B1 0x29B1。它在目录里的正式名是 CRC-16/IBM-3740:poly 0x1021、init 0xFFFF、不反转。

CRC 一共有多少个变体?

63 本计算器收录 63 个:位宽 8 的 20 个、位宽 16 的 31 个、位宽 32 的 12 个。

什么是 CRC 校验(循环冗余校验)?

循环冗余校验把一段数据看作一个很长的二进制多项式的系数,用模 2 运算除以一个固定的生成多项式,留下余数。这个余数就是校验值。这种构造之所以流行,一是因为除法归结为移位和异或,在硬件上几乎不要钱;二是因为代数给的是硬保证而不是统计上的指望:一个选得好的 16 位多项式能检出全部单比特错误、有效块长内的全部双比特错误、任意奇数个比特翻转,以及全部长度不超过 16 位的连续突发错误。

真正让 CRC 在实践中变得混乱的,是多项式只不过是六个参数之一。两个实现可以在多项式上完全一致,结果却没有一个对得上——因为它们在寄存器初始值上不同,在输入字节和输出寄存器是否颠倒位序上不同,在最后异或进去的常数上也不同。一个 CRC 变体指的是这整组参数,不是多项式本身——这就是为什么「CRC-16」这样的名字单独拿出来几乎什么也没说明,也是本页在每个结果旁边列出多项式、初始值、两个反转标志和最终异或,并把位宽作为分组标题的原因。

还有一点是表格显示不出来的:16 位多项式能检出任意奇数个比特翻转,前提是 x+1 整除它。最常遇到的两个——0x1021 和 0x8005——满足这个条件,但并非所有多项式都满足:CRC-16/T10-DIF 和 CRC-16/PROFIBUS 就在例外之列。

// CRC-16/MODBUS: poly=0x8005, init=0xFFFF, refin/refout=true, xorout=0x0000
// Written in the reflected form, so the polynomial appears bit-reversed as 0xA001.
function crc16Modbus(bytes) {
  let crc = 0xffff;
  for (const byte of bytes) {
    crc ^= byte;
    for (let i = 0; i < 8; i++) {
      crc = crc & 1 ? (crc >>> 1) ^ 0xa001 : crc >>> 1;
    }
  }
  return crc;
}

crc16Modbus([0x01, 0x03, 0x00, 0x00, 0x00, 0x0a]); // 0xCDC5
// On the wire Modbus RTU sends the low byte first: ... 0x0A 0xC5 0xCD

CRC 计算器的核心功能

63 个变体一次算完

CRC-8、CRC-16、CRC-32 随着你输入同步重算。不用先在下拉框里猜一个才能看到东西。

反查变体

填入别人给你的校验值,能产出它的变体会被高亮,识别一个未知算法从试二十次变成一步。

正式名与手册名并列

每行同时给出 RevEng 目录的正式名和现场实际使用的别名——CCITT-FALSE、CRC-16/IBM、CRC-32C、X-25 等等。

完整参数表

多项式、初始值、两个反转标志和最终异或就列在结果旁边,方便你对着规范核实是不是真的匹配。

自定义参数

位宽、多项式、初始值、反转和最终异或全部可改,用于那些从未进过任何目录的多项式。

完全离线运行

计算在你的浏览器里发生。生产报文和固件镜像不会离开这台机器。

CRC16 / CRC32 计算实例

标准自检值

123456789
CRC-32/ISO-HDLC = 0xCBF43926, CRC-16/MODBUS = 0x4B37, CRC-8/SMBUS = 0xF4

RevEng 目录里每个 CRC 变体都公布了它对 ASCII 字符串 123456789 的结果。这让这个输入成了标准自检:某个库如果和这里的表对不上,那是库错了。

一帧 Modbus RTU 请求

01 03 00 00 00 0A
CRC-16/MODBUS = 0xCDC5

从 1 号从机读保持寄存器。Modbus RTU 在线路上先发 CRC 低字节,所以这帧实际是 01 03 00 00 00 0A C5 CD——相当一部分「校验值对不上」都出在这个顺序上。

同样的字节,四个 CRC-16 答案

DEADBEEF
MODBUS = 0xC19B, CCITT-FALSE = 0x4097, XMODEM = 0xC457, KERMIT = 0x1915

以十六进制模式读取,因此是四个字节,而不是字符串的八个字符。四个最常见的 CRC-16 变体对它们给出完全不相干的结果。这不是哪里坏了:它们的区别在初始值、反转和最终异或,不在对错。

从设备返回值反查

123456789,期望值 0x29B1
CRC-16/IBM-3740(你的手册上多半写作 CRC-16/CCITT-FALSE)

这正是本工具要解决的场景:你手上有数据,也有别人算出的校验值,唯独不知道变体名——于是反过来找能复现它的那组参数。

CRC校验计算器怎么用

  1. 1

    选文本还是十六进制

    协议报文几乎一定是十六进制。只有在给一个字面字符串算校验时才用文本模式,比如 123456789 这个自检值。

  2. 2

    粘贴数据

    十六进制模式下分隔符会被忽略,所以 01 03 00 00 00 0A、0x01 0x03 和 010300 00000A 都能识别。

  3. 3

    找到你要的变体

    表格按位宽分组。正式名取自 RevEng 目录,下面一行是你设备手册上更可能出现的别名。

  4. 4

    或者反过来查

    如果你已经有校验值、想知道它属于哪个变体,把它填进「期望值」框,看高亮那一行。

CRC 校验值对不上的几种原因

算的是文本「01 03」而不是那两个字节

停在文本模式下,工具算的是你那串十六进制转储的 ASCII 字符,而不是它所表示的字节。切到十六进制模式——模式开关下方的字节数会告诉你当前是按哪种读法。

✗ 错误
Text mode, input "01 03" -> 5 bytes: 30 31 20 30 33
✓ 正确
Hex mode, input "01 03" -> 2 bytes: 01 03

拿字节交换过的校验值做比较

Modbus RTU 先传 CRC 低字节。末尾是 C5 CD 的帧,它的校验值是 0xCDC5,不是 0xC5CD。

✗ 错误
expected 0xC5CD  (bytes read in transmission order)
✓ 正确
expected 0xCDC5  (bytes reassembled low-byte-first)

把校验字段本身也算了进去

CRC 覆盖的是它前面那些字节。把整帧连尾部一起喂回去,得到的是残差而不是校验值。

✗ 错误
01 03 00 00 00 0A C5 CD    <- trailer included
✓ 正确
01 03 00 00 00 0A          <- payload only

以为「CRC-16」就指定了一个算法

收录在案的 16 位变体有 31 个。缺了另外五个参数,这个名字什么也没缩小。

✗ 错误
spec says: "trailer is a CRC-16"
✓ 正确
spec says: "CRC-16/MODBUS, poly 0x8005, init 0xFFFF, refin/refout true"

什么时候需要 CRC 在线计算

排查 Modbus 链路
PLC 拒收你的帧,你需要判断是 CRC 算错了还是只是字节顺序反了。算一遍 CRC-16/MODBUS,两种顺序都比一下。
识别没有文档的协议
你抓到的报文尾部有两个字节像是校验和。把载荷和这两个字节交给反查,看哪个变体认领它。
在不同工具链之间移植固件
厂商库和你自己的实现对不上。拿两者分别跑标准自检值,就知道是哪一边跑偏了。
撰写或评审协议规范
在协议文档里只写「CRC-16」等于预定了互通性缺陷。参数表给的是真正能把算法钉死的那六个值。
校验已存储的数据
文件系统、归档格式和 Flash 镜像里都带 CRC-32 字段。重算一次就知道某个块有没有完好无损。

CRC 循环冗余校验的工作原理

多项式的表示法
表中的多项式采用常规(高位在前)形式:0x8005 表示 x^16 + x^15 + x^2 + 1。反转实现常把同一个多项式写成 0xA001,Koopman 记法又是另一种移位方式。一个多项式三种写法,是移植失败的常见来源。
初始值
让寄存器从 0xFFFF 而不是 0x0000 开始,校验值才会对开头的零字节敏感。初始值为零时,在报文前面加零不改变 CRC——而这恰恰是带帧协议必须抓住的那种损坏。
反转
refin 颠倒每个输入字节内部的位序,refout 颠倒最终寄存器的位序。硬件按高位在前的顺序移位,而面向字节的软件觉得低位在前更省事,反转参数就是用来调和这两者的。
最终异或
xorout 在最后施加,它并不等于把 init 挪到另一端。报文末尾追加的零字节,两种情况下都能检出。非零 xorout 真正改变的是接收方把报文和校验值连在一起做 CRC 时得到的残差:xorout 为零时残差本身也是零,于是追加在 CRC 字段之后的零仍然能通过。它同时让全零报文产生非零的校验值。
自检值
每个收录的变体都公布了它对 ASCII 字符串 123456789 的结果。载入该输入时本页显示的这 63 个值,就是那些公布的常数——本页引擎正是照着它们做测试的。

怎样才能算对 CRC 校验值

写参数,别只写算法名
规范里应当写成「poly 0x1021, init 0xFFFF, refin false, refout false, xorout 0x0000」。「CRC-16/CCITT」至少指代过三种不同的东西。
把字节序单独查一遍
当校验值差一个字节交换就能对上时,算法是对的,错的是组帧。把这两者当成两个不同的缺陷来处理。
先拿自检值验实现
在排查数据之前,先确认你的实现对 123456789 能返回目录里的值。几秒钟就能把「算法坏了」和「输入错了」分开。
明确校验范围
多数不匹配都出在起始标记、地址或长度字段被算进去或被漏掉。确定 CRC 到底覆盖哪几个字节,并把它写下来。
需要消息认证时不要用 CRC
CRC 是线性的,伪造起来毫不费力。只要攻击者有可能改动数据,就该改用 HMAC

CRC 校验常见问题

为什么设备算出来的 CRC 和这里不一样?
几乎都是因为在拿两个不同的变体做比较。光 CRC-16 就有 31 组收录在案的参数,MODBUS、CCITT-FALSE、XMODEM、KERMIT 会从同样的字节里算出四个毫不相干的数。把设备给的值填进「期望值」框:只要有变体能复现它,对应那行就会高亮,答案就出来了。如果一个都对不上,说明被校验的数据不是你以为的那段——检查字节序,也检查帧的起止标记有没有被算进去。
Modbus 用的是哪个 CRC-16?
CRC-16/MODBUS:多项式 0x8005,初始值 0xFFFF,输入输出都反转,无最终异或。真正容易搞混的是传输顺序而不是算法本身——Modbus RTU 先发 CRC 低字节,所以校验值为 0xCDC5 的帧,末尾两个字节是 C5 CD。完整的报文推演见 CRC-16 校验变体详解
CRC-16/CCITT 和 CRC-16/CCITT-FALSE 有什么区别?
它们是两个不同的算法,名字却像到能互相冒充,RevEng 目录正是因此把两个都改了名。大家说的 CCITT-FALSE 其实是 CRC-16/IBM-3740:初始值 0xFFFF,不反转。而通常所说的 CCITT 指的是 CRC-16/KERMIT:初始值 0x0000,输入输出都反转。本工具会同时显示正式名和你设备手册上更可能写的那个名字。
CRC 能检测出文件被人篡改吗?
不能。CRC 是为噪声信道上的偶发损坏设计的检错码,而且它是线性的——任何人都能改动报文并把 CRC 调回匹配。要防住有意的攻击者,请用密码学哈希,例如 SHA-256,或者带认证的构造如 HMAC。CRC 在它被设计出来做的事情上非常出色,但完全不提供安全性。
refin 和 refout 到底做了什么?
refin 在每个输入字节送进寄存器前把它的位序颠倒;refout 把最终寄存器的位序颠倒。它们存在,是因为硬件移位寄存器和软件查表实现的移位方向相反,反转形式让两者能得到同一个数。它们不等于字节序——反转作用在一个字节内部的位上,而字节序决定的是字节之间的先后。
我只有校验值,没有原始数据。这个工具能反推吗?
不能,任何工具都不能。CRC 把任意长的报文压成 8、16 或 32 位,因此无数条不同的报文共用同一个值——这不是花多少力气的问题。本页的反查回答的是一个更窄的问题:给定数据别人由它算出的校验值,是哪一组参数把两者连起来的。如果你抓到了设备的响应却没抓到背后的载荷,那就先去把载荷抓下来。至于在几种位宽之间怎么选,而不是识别某一个变体,见 CRC-16 校验变体详解
我的设备只列了一个变体,为什么这里要显示 63 个?
因为真正有用的问题往往不是「算个 CRC」,而是「我手上这个值是哪个变体算的」。逼你先选变体的工具,等于默认你已经知道答案了。把全部变体一次摆出来,识别就变成一次查表;旁边的参数列还让你能对着规范确认,而不是只凭一个名字。
我的数据会被上传吗?
不会。整个计算在你的浏览器里完成,用的就是渲染本页表格的同一套引擎——没有上传、没有接口调用、没有日志。断网后工具照常工作,这一点很重要,因为 CRC 的输入常常是生产报文或固件镜像。