CRC32 在线计算

CRC32 校验码是把一段数据按循环冗余校验算法压成的 32 位数值,常写成 8 位十六进制,用来发现传输和存储中的意外出错。本页能算文本、十六进制字节和文件,一次给出 CRC-32、CRC-32C、BZIP2、MPEG-2、JAMCRC、cksum 六种变体及 hex、十进制、有符号写法;粘贴别人给的值能认出是哪种。中文可切 GBK,本地计算不上传。

自定义参数(高级,仅 32 位)

这组参数对 123456789 的 check 值:cbf43926(对照数据手册或 CRC 目录里的 check 一栏,一致即参数填对了)

文本、字节与文件都在本机计算,不上传、不保存;只记住输入方式、编码这类偏好。 单次文本或十六进制上限 2 MB,逐行最多 10000 行。

如何使用CRC32 在线计算

1

选输入方式:文本直接粘贴;协议报文、抓包数据切到「十六进制」贴 01 02 03 04;文件切到「文件」拖进来,可一次拖多个。

2

看结果:上方主卡是 CRC-32 的七种写法(8 位 hex、大写、0x、十进制、有符号、大端与小端字节序),下方表格同时列出 CRC-32C、MPEG-2 等其他五种变体,点哪行复制哪行。

3

对不上时把别人给的值粘进「期望值」:工具会自动认出它是 hex、十进制还是负数,以及对应哪种变体;仍不一致会逐条列出可能原因(换行、编码、字节序、前导零…)。

4

需要批量或分表:打开「逐行计算」,一行一条出表,可填「取模 N」直接看分片号,复制 TSV 或下载 CSV。

关于CRC32 在线计算的常见问题

CRC32 在线计算会上传我的文本和文件吗?
不会。本页的 CRC32 在线计算全程在浏览器本地完成:文本、十六进制字节和文件都只在你的设备上读取和计算,不上传到任何服务器,打开 F12 的网络面板再算一次就能自证。页面只把输入方式、编码、主卡变体这类偏好记在本机,文本、期望值、文件名和自定义参数一律不保存。
为什么我算的 CRC32 和别人的对不上?
先把对方的值粘进「期望值」框,本页会在六种变体、七种写法和常见输入变形里替你找。最常见的五个原因:一是变体不同,123456789 的 CRC-32 是 cbf43926,CRC-32C 是 e3069283,MPEG-2 是 0376e6e7;二是写法不同,同一个值可能写成十进制、负数或者丢了前导零;三是字节序反了;四是末尾多了一个换行,hello 是 3610a686,hello 加换行是 363a3020;五是中文编码不同,「你好」UTF-8 是 50a2b841,GBK 是 6f881d8c。
CRC32 和 CRC32C 有什么区别?
两者的多项式不同(CRC32 是 04C11DB7,CRC32C 是 1EDC6F41),结果毫无关系:123456789 分别是 cbf43926 和 e3069283。CRC32C 的检错能力更好,而且 x86 的 SSE4.2 和 ARMv8 都有专门的硬件指令,所以 iSCSI、ext4、Btrfs、Kafka、LevelDB 这类存储与网络协议多用它;zip、gzip、PNG 以及 PHP、Python 里的 crc32() 用的是 CRC32。本页两种同时给出。
CRC32 结果是负数或十进制怎么换成 hex?
它们是同一个 32 位数的不同写法,不需要重新计算。以「小鹿tools」为例:hex 是 e4c9465d,无符号十进制是 3838395997,有符号写法是 -456571299。负数加上 4294967296 就是无符号值,再转十六进制补齐 8 位即可。本页主卡把 hex、大写、0x、十进制、有符号和两种字节序七种写法同时列出,各带复制按钮。
CRC32 结果为什么有时只有 6 位或 7 位?
因为代码里转十六进制时没有补前导零。123456 的 CRC32 是 0972d361,JS 的 toString(16) 或 Java 的 Integer.toHexString 会得到 972d361;deer77 是 0042aae6,直接转只剩 42aae6。补齐到 8 位即可:JS 用 padStart(8, "0"),Python 用 f"{v:08x}",Java 用 String.format("%08x", v)。本页的 hex 写法一律补齐 8 位,粘进期望值框的短值也会自动补零比对。
在线 CRC32 和 Linux cksum 命令结果为什么不同?
因为 cksum 命令算的不是 zip 那种 CRC32:它的参数不同(不反转、初值为 0),还会把数据长度追加到末尾一起算。printf 123456789 | cksum 输出的是 930766865,与 CRC-32 的 cbf43926 毫无关系。本页变体表最后一行「cksum 命令」与系统 cksum 输出一致;要和 Linux 上的 CRC-32 对拍,请用 crc32 命令(Perl 的 Archive::Zip 自带)或 gzip -lv 显示的 crc 列。
中文的 CRC32 为什么会有两个不同的值?
CRC 吃的是字节不是字符,同一段中文用不同编码取到的字节不同。「你好」按 UTF-8 是 6 个字节,CRC32 为 50a2b841;按 GBK 是 4 个字节,CRC32 为 6f881d8c,两个都对。把本页的编码切成和对方一致即可对上;老系统、数据库的 GBK 字段、Windows 记事本的 ANSI 存盘多半是 GBK。
CRC32 校验能判断文件有没有被篡改吗?
不能防人为篡改。CRC 是线性的,改动文件里任意 4 个字节就能把 CRC32 凑成任意目标值,所以有心人可以改完内容再把校验值补回去。CRC32 擅长的是发现随机出错:传输或存储中的单个突发错误只要不超过 32 位就一定能检出。要防篡改请用 SHA-256,可以到「文件 MD5/SHA 校验」或「文件校验和验证」两页去算。
十六进制字节怎么算 CRC32 校验码?
切到「十六进制」标签,把字节粘进去即可:01 02 03 04、0x01,0x02,0x03,0x04、01020304、\x01\x02 这些写法都认,非法字符会指出是第几个字符。注意文本「01020304」和字节 01 02 03 04 不是一回事:前者是 8 个 ASCII 字符,后者是 4 个字节,CRC-32 为 b63cfbcd。在文本框里贴了十六进制串时,本页也会提醒你切换标签。
CRC32 取模分库分表怎么算?
打开「逐行计算」并填「取模 N」,每行会多一列分片号。要用无符号值取模:admin 的 CRC32 是 2282622326,对 16 取模得 6;但在 Java、JS、C# 这类有符号语言里它是 -2012344970,直接 % 16 会得到 -10,分片号为负。先转无符号再取模:JS 用 >>> 0,Java 用 (crc & 0xFFFFFFFFL) % N 或 Integer.toUnsignedLong(crc) % N。别用 Math.floorMod 代替:它只让余数非负,N 不是 2 的幂时(如 10)分片号会和无符号取模不同。CRC32 取模分布够均匀,但它不是一致性哈希,扩容时要整体迁移。
CRC32 在线计算支持多大的文件?
文件模式按片流式读取,不限单个文件大小,实际只受设备内存与耐心限制,一次最多 20 个文件,可随时取消。文本和十六进制模式单次上限 2 MB,逐行计算最多 10000 行;超过 200KB 会关掉边输入边算,改成点按钮计算。手机浏览器同样能用,小屏下变体表会变成卡片排列。

六种 CRC-32 变体:参数、check 值与常见出处

CRC-32 不是一种算法,而是一族:同样输出 32 位,只要多项式、初值、是否反转、结果异或值这五个参数里有一个不同, 算出来的值就完全不同。下表是本页内置的六种,check 一栏是各自对 ASCII 字符串 123456789 的标准结果, CRC 目录(reveng catalogue)和数据手册都用这个值来自证实现正确。

六种 CRC-32 变体的 Rocksoft 参数(多项式 / 初值 / 输入反转 / 输出反转 / 结果异或)与 check 值
变体多项式初值输入反转输出反转结果异或check(123456789)常见出处
CRC-3204C11DB7FFFFFFFF是是FFFFFFFFcbf43926zip、gzip、PNG、以太网 FCS、PHP crc32()、Python zlib.crc32、Java CRC32
CRC-32C1EDC6F41FFFFFFFF是是FFFFFFFFe3069283iSCSI、SCTP、ext4/Btrfs 元数据、Kafka、LevelDB/RocksDB、x86 SSE4.2 crc32 指令
CRC-32/BZIP204C11DB7FFFFFFFF否否FFFFFFFFfc891918bzip2、ATM AAL5
CRC-32/MPEG-204C11DB7FFFFFFFF否否000000000376e6e7MPEG-TS 节表(PAT/PMT)、DVB
CRC-32/JAMCRC04C11DB7FFFFFFFF是是00000000340bc6d9Altera/Intel FPGA 工具、部分嵌入式 SDK
cksum 命令04C11DB700000000否否FFFFFFFF930766865(十进制,含长度)Linux / macOS 的 cksum 命令

两个一眼就能用上的等式:JAMCRC = CRC-32 按位取反(cbf43926 ⊕ ffffffff = 340bc6d9),MPEG-2 = BZIP2 按位取反(fc891918 ⊕ ffffffff = 0376e6e7)。所以你的值和本页 CRC-32 正好每一位都相反,对方用的就是 JAMCRC; 和 BZIP2 相反就是 MPEG-2。CRC32 BZIP2 与 CRC-32 用的是同一个多项式,区别只在不反转,所以两者也毫无关系。 本页内部也正是利用这两个等式,只跑 4 个寄存器就同时得到 6 个结果。

同一个 CRC32 的七种写法

「对不上」的另一大来源是写法:值本身一样,只是一边写成十六进制、一边写成十进制或负数。以示例文本「小鹿tools」的 CRC-32 为例:

「小鹿tools」的 CRC-32 七种写法与各自出现的场景
写法示例常见于
8 位小写 hexe4c9465dcrc32 命令、gzip -lv、多数在线工具;永远补齐前导零
大写 hexE4C9465D7-Zip、WinRAR、多数 Windows 工具
0x 前缀0xE4C9465DC / C++ / Java 源码里的常量写法
无符号十进制3838395997PHP crc32()(64 位)、Python zlib.crc32、Java CRC32.getValue()、cksum 命令
有符号 int32-456571299JS 位运算 | 0、C# (int) 强转、32 位 PHP
字节序列(大端)e4 c9 46 5dPNG 块尾、以太网与多数网络协议
字节序列(小端)5d 46 c9 e4zip 文件头、gzip 文件尾

三个高频的坑:

  • CRC32 前导零:123456 的 CRC32 是 0972d361,toString(16) 只给 7 位 972d361;deer77 是 0042aae6,直接转只剩 6 位。CRC32 永远是 8 位十六进制。
  • CRC32 负数:结果大于 2147483647 时,在 JS 位运算、C# 的 int、32 位 PHP 里会显示成负数, 如 -456571299;加上 4294967296 就回到 CRC32 十进制的无符号值 3838395997。
  • 字节序:PNG 块尾按大端存(e4 c9 46 5d),zip 文件头按小端存(5d 46 c9 e4);用十六进制编辑器看文件时读反了,就会得到 5d46c9e4 这样一个「错」的值。

CRC32 和别人算的不一样:逐条排查

把对方给的值粘进「期望值」框,以下能自动验证的项本页会直接给出结论;其余按顺序人工排查。

CRC32 不一致的十个原因与实测例
#原因怎么判定实测例
1用的不是同一种 CRC-32期望值命中其他变体(自动)123456789:CRC-32 cbf43926,CRC-32C e3069283,MPEG-2 0376e6e7
2和本页结果按位取反命中 JAMCRC 或 MPEG-2(自动)cbf43926 与 340bc6d9
3少了前导零短 hex 补零后命中(自动)123456 → 0972d361,toString(16) 得 972d361
4十进制或负数写法十进制 / 负数读法命中(自动)小鹿tools → 3838395997 / -456571299
5字节序反了字节反转读法命中(自动)e4c9465d 与 5d46c9e4
6末尾多或少一个换行加/去末尾换行后命中(自动)hello 3610a686,hello 加换行 363a3020
7中文编码不同换编码后命中(自动)你好:UTF-8 50a2b841,GBK 6f881d8c
8对方按字节算、你按文本算按十六进制字节解析后命中(自动)字节 01 02 03 04 的 CRC-32 是 b63cfbcd,与文本 01020304 不同
9用的是 cksum 命令命中「cksum 命令」变体(自动)hello 的 cksum 是 3287646509
10都不是人工对方可能用 CRC-16 / CRC-64、先压缩或加盐、按 32 位字喂数据;可在「自定义参数」里按文档填五个参数

cksum 命令为什么和 CRC-32 不一样

Linux 和 macOS 自带的 cksum 命令遵循 POSIX 规定:多项式同样是 04C11DB7,但不反转、初值为 0, 而且在数据后面追加了「长度」的字节(小端、去掉高位的零,长度为 0 时不追加)再算,最后取反。 所以 printf 123456789 | cksum 输出的是 930766865(十六进制 377a6011),而 CRC 目录里叫 CRC-32/CKSUM 的那一项 check 值是 765e7680——差别就在那几个长度字节。空输入时 cksum 输出 4294967295,hello 输出 3287646509。

本页变体表的「cksum 命令」一行与系统命令逐位一致,相当于一个 cksum 在线版;如果你要的是不含长度的目录值, 在「自定义参数」里填 04C11DB7 / 00000000 / 不反转 / 不反转 / FFFFFFFF 即可得到 765e7680。

字符串 CRC32 与中文编码:为什么有两个值

算字符串 CRC32 之前,文字必须先变成字节,而中文按不同编码取到的字节不一样。本页默认 UTF-8,可切 GBK:

同一段文字在 UTF-8 与 GBK 下的字节数与 CRC-32
文本UTF-8 字节UTF-8 的 CRC-32GBK 字节GBK 的 CRC-32
你好650a2b8414(c4 e3 ba c3)6f881d8c
小鹿tools11e4c9465d9de7657f0

两个值都对,只是口径不同;GBK 编不出的字符(emoji、韩文、部分生僻字)本页会列出来并且不给结果, 不会偷偷替换成问号——那样会给出一个看着对其实错的 CRC。

CRC32 取模分表:无符号与有符号的坑

拿 crc32(key) % N 做分库分表、分桶很常见,本页「逐行计算」填上取模 N 就能批量看分片号。下表是填入示例、N = 16 的结果:

逐行示例:CRC-32 对 16 取模(无符号)与有符号语言里直接取模的结果
原文字节CRC-32十进制% 16(无符号)有符号语言直接 %
12345660972d3611585201611同左
admin5880e0d7622826223266-10
你好650a2b84113528412811同左
小鹿tools11e4c9465d383839599713-3

各语言的正确写法(先拿到无符号值再取模):

常见语言里 CRC32 取模的写法
语言写法说明
PHP(64 位)crc32($key) % 1664 位 PHP 返回非负整数,直接取模即可
Python 3zlib.crc32(key.encode()) % 16返回值恒为无符号
Javacrc.getValue() % 16 或 (crcInt & 0xFFFFFFFFL) % 16CRC32.getValue() 是非负 long,可直接取模;存成 int 的要先 & 0xFFFFFFFFL 或 Integer.toUnsignedLong,Math.floorMod 不等于无符号取模
JavaScript(crc >>> 0) % 16位运算结果是有符号的,先 >>> 0
Gocrc32.ChecksumIEEE(b) % 16uint32,天然无符号

常见语言里的 CRC32:返回的是哪种写法

各语言标准库的 CRC32 / CRC32C 函数与返回值形态
语言CRC-32CRC-32C返回值
PHPcrc32($s);hash("crc32b", $s) 给 8 位 hex—64 位 PHP 为非负整数,32 位 PHP 可能为负,可用 sprintf("%u")
Python 3zlib.crc32(b) / binascii.crc32(b)—(标准库没有)恒为无符号整数
Javajava.util.zip.CRC32java.util.zip.CRC32C(Java 9 起)getValue() 返回 long,非负
Node.jszlib.crc32(data)(v22.2 / v20.15 起)—无符号整数
Gocrc32.ChecksumIEEE(b)crc32.Checksum(b, crc32.MakeTable(crc32.Castagnoli))uint32
浏览器 JS无内置,常见手写实现末尾 ^ -1—常为有符号,需要 >>> 0

对拍时记住:这些函数算的都是 CRC-32(zip 口径),与本页变体表第一行一致;hex 写法请自己补齐 8 位。

CRC32 能做什么、不能做什么

本页的边界与几种叫法

CRC32 在线计算的能力边界
事项本页的处理
位宽只做 32 位;CRC-8、CRC-16、CRC-64 不在本页,自定义参数也只收 32 位
文本 / 十六进制上限单次 2 MB(按编码后的字节数计),超过请改用文件模式
逐行计算最多 10000 行;表格只显示前 500 行,复制与下载是全部
自动计算超过 200KB(逐行再加 2000 行)改为点按钮计算
文件一次最多 20 个,不限单个大小,分片流式计算可取消
反算原文 / 构造指定 CRC不做:CRC 不是加密,本页只算不反推
文件的 MD5 / SHA不做,请用「文件 MD5/SHA 校验」
这件事的几种叫法,在本页对应哪里
叫法通常指什么本页对应
CRC32 计算 / CRC32 校验 / CRC32 在线给一段数据算 CRC-32文本标签,粘贴即出
CRC32 校验码计算 / CRC 校验码同上,强调结果是校验码主卡七种写法
CRC32C 在线计算Castagnoli 多项式的 CRC-32C变体表第二行
CRC-32/MPEG-2 / CRC32 BZIP2 / JAMCRC同为 32 位、参数不同的其他 CRC 变体变体表第三至五行
十六进制 CRC32对一串字节而不是文字算十六进制标签
CRC32 十进制 / CRC32 负数同一个值的十进制与有符号写法主卡第四、五行
cksum 在线和 Linux cksum 命令对拍变体表最后一行
CRC32 取模分表crc32(key) % N 求分片号逐行计算 + 取模 N
CRC32 online / CRC32 calculator / CRC32 checksum online英文语境下的同一件事整页