piapia123
zh

CRC-16 校验码计算

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

算出文本的 CRC-16 校验值。CRC-16 在工业与嵌入式领域出现得比 CRC-32 还频繁 —— Modbus 报文末尾那两个字节、1-Wire 器件的 ROM 校验、蓝牙与 X.25 的帧校验,用的都是它。但它也是变体最多的一族:同一个 0x8005 或 0x1021 多项式,配上不同的初始值、是否按位反转、结果异或值,能派生出三十多个互不兼容的算法,而它们算出来的数字毫无关系。这里收录了最常用的九个,每一项都标注了用途与出处,切换前先看清对面系统用的是哪个 —— 这是 CRC 类工具最容易出错、也最难排查的地方。

功能

  • 九个常用变体:ARC、Modbus、USB、MAXIM、CCITT-FALSE、XMODEM、KERMIT、X-25、DNP
  • 每个变体标注用途 —— Modbus 报文、1-Wire 器件、X.25 帧各用哪一个
  • 输出十六进制(可切大小写)或十进制
  • 中文按 UTF-8 字节计算,与各语言实现一致
  • 每个变体都用参数目录的检定串锚定,参数不会抄错
  • 计算只在本机进行,内容不会上传

使用方法

  1. 把内容粘贴进输入框,结果实时出现
  2. 按对面系统选变体(如 Modbus 就选 CRC-16/MODBUS)
  3. 按需切换十六进制 / 十进制与大写
  4. 点「复制」取走校验值

常见问题

为什么 CRC-16 有这么多变体?
因为 CRC-16 的「16」只规定了校验值是 16 位,没规定别的。多项式选哪个、初始值填什么、输入字节要不要按位反转、结果要不要再异或一个常数 —— 这四个参数在历史上被各家厂商各自拍板,于是同一个名字下出现了几十个互不兼容的实现。ARC(也叫 IBM)是最早的那个,Modbus、USB、X-25 都是它在不同场合的变体。看名字记不住,所以这个工具每一项都标了用途。
Modbus 用的是哪一个?
CRC-16/MODBUS:多项式 0x8005、初始值 0xFFFF、输入输出都按位反转、结果不再异或。它在 Modbus RTU 报文里就是最后那两个字节,低字节在前。要注意 Modbus TCP 不用它(那层有以太网的校验),只有 RTU 和 ASCII 模式才需要手工算。
怎么知道对方系统用的是哪个变体?
三个办法,按可靠程度排:一是查协议文档,通常写明多项式与初始值;二是找一个已知的验证值 —— 最标准的检定输入是字符串 `123456789`,本工具每个变体算出来的结果都与 CRC 参数目录里登记的一致,你可以逐个试,哪个对上了就是它;三是看代码,`0xA001` 这个反射后的 0x8005 出现在源码里,基本就能确定是 ARC 系列。
为什么算出来的值和手册上的对不上?
最常见的原因有两个。一是变体选错了(见上一条)—— 同一个 0x8005,ARC 算出来是 BB3D,Modbus 是 4B37,MAXIM 是 44C2。二是字节范围搞错了:CRC 算的是字节流,如果你只把报文的数据段贴进来,而对方算的是「地址 + 功能码 + 数据」整帧,结果必然不同。确认两者的输入范围完全一致。

相关工具