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 在线计算
选输入方式:文本直接粘贴;协议报文、抓包数据切到「十六进制」贴 01 02 03 04;文件切到「文件」拖进来,可一次拖多个。
看结果:上方主卡是 CRC-32 的七种写法(8 位 hex、大写、0x、十进制、有符号、大端与小端字节序),下方表格同时列出 CRC-32C、MPEG-2 等其他五种变体,点哪行复制哪行。
对不上时把别人给的值粘进「期望值」:工具会自动认出它是 hex、十进制还是负数,以及对应哪种变体;仍不一致会逐条列出可能原因(换行、编码、字节序、前导零…)。
需要批量或分表:打开「逐行计算」,一行一条出表,可填「取模 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)和数据手册都用这个值来自证实现正确。
| 变体 | 多项式 | 初值 | 输入反转 | 输出反转 | 结果异或 | check(123456789) | 常见出处 |
|---|---|---|---|---|---|---|---|
| CRC-32 | 04C11DB7 | FFFFFFFF | 是 | 是 | FFFFFFFF | cbf43926 | zip、gzip、PNG、以太网 FCS、PHP crc32()、Python zlib.crc32、Java CRC32 |
| CRC-32C | 1EDC6F41 | FFFFFFFF | 是 | 是 | FFFFFFFF | e3069283 | iSCSI、SCTP、ext4/Btrfs 元数据、Kafka、LevelDB/RocksDB、x86 SSE4.2 crc32 指令 |
| CRC-32/BZIP2 | 04C11DB7 | FFFFFFFF | 否 | 否 | FFFFFFFF | fc891918 | bzip2、ATM AAL5 |
| CRC-32/MPEG-2 | 04C11DB7 | FFFFFFFF | 否 | 否 | 00000000 | 0376e6e7 | MPEG-TS 节表(PAT/PMT)、DVB |
| CRC-32/JAMCRC | 04C11DB7 | FFFFFFFF | 是 | 是 | 00000000 | 340bc6d9 | Altera/Intel FPGA 工具、部分嵌入式 SDK |
| cksum 命令 | 04C11DB7 | 00000000 | 否 | 否 | FFFFFFFF | 930766865(十进制,含长度) | 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 为例:
| 写法 | 示例 | 常见于 |
|---|---|---|
| 8 位小写 hex | e4c9465d | crc32 命令、gzip -lv、多数在线工具;永远补齐前导零 |
| 大写 hex | E4C9465D | 7-Zip、WinRAR、多数 Windows 工具 |
| 0x 前缀 | 0xE4C9465D | C / C++ / Java 源码里的常量写法 |
| 无符号十进制 | 3838395997 | PHP crc32()(64 位)、Python zlib.crc32、Java CRC32.getValue()、cksum 命令 |
| 有符号 int32 | -456571299 | JS 位运算 | 0、C# (int) 强转、32 位 PHP |
| 字节序列(大端) | e4 c9 46 5d | PNG 块尾、以太网与多数网络协议 |
| 字节序列(小端) | 5d 46 c9 e4 | zip 文件头、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 和别人算的不一样:逐条排查
把对方给的值粘进「期望值」框,以下能自动验证的项本页会直接给出结论;其余按顺序人工排查。
| # | 原因 | 怎么判定 | 实测例 |
|---|---|---|---|
| 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 字节 | UTF-8 的 CRC-32 | GBK 字节 | GBK 的 CRC-32 |
|---|---|---|---|---|
| 你好 | 6 | 50a2b841 | 4(c4 e3 ba c3) | 6f881d8c |
| 小鹿tools | 11 | e4c9465d | 9 | de7657f0 |
两个值都对,只是口径不同;GBK 编不出的字符(emoji、韩文、部分生僻字)本页会列出来并且不给结果, 不会偷偷替换成问号——那样会给出一个看着对其实错的 CRC。
CRC32 取模分表:无符号与有符号的坑
拿 crc32(key) % N 做分库分表、分桶很常见,本页「逐行计算」填上取模 N 就能批量看分片号。下表是填入示例、N = 16 的结果:
| 原文 | 字节 | CRC-32 | 十进制 | % 16(无符号) | 有符号语言直接 % |
|---|---|---|---|---|---|
| 123456 | 6 | 0972d361 | 158520161 | 1 | 同左 |
| admin | 5 | 880e0d76 | 2282622326 | 6 | -10 |
| 你好 | 6 | 50a2b841 | 1352841281 | 1 | 同左 |
| 小鹿tools | 11 | e4c9465d | 3838395997 | 13 | -3 |
各语言的正确写法(先拿到无符号值再取模):
| 语言 | 写法 | 说明 |
|---|---|---|
| PHP(64 位) | crc32($key) % 16 | 64 位 PHP 返回非负整数,直接取模即可 |
| Python 3 | zlib.crc32(key.encode()) % 16 | 返回值恒为无符号 |
| Java | crc.getValue() % 16 或 (crcInt & 0xFFFFFFFFL) % 16 | CRC32.getValue() 是非负 long,可直接取模;存成 int 的要先 & 0xFFFFFFFFL 或 Integer.toUnsignedLong,Math.floorMod 不等于无符号取模 |
| JavaScript | (crc >>> 0) % 16 | 位运算结果是有符号的,先 >>> 0 |
| Go | crc32.ChecksumIEEE(b) % 16 | uint32,天然无符号 |
常见语言里的 CRC32:返回的是哪种写法
| 语言 | CRC-32 | CRC-32C | 返回值 |
|---|---|---|---|
| PHP | crc32($s);hash("crc32b", $s) 给 8 位 hex | — | 64 位 PHP 为非负整数,32 位 PHP 可能为负,可用 sprintf("%u") |
| Python 3 | zlib.crc32(b) / binascii.crc32(b) | —(标准库没有) | 恒为无符号整数 |
| Java | java.util.zip.CRC32 | java.util.zip.CRC32C(Java 9 起) | getValue() 返回 long,非负 |
| Node.js | zlib.crc32(data)(v22.2 / v20.15 起) | — | 无符号整数 |
| Go | crc32.ChecksumIEEE(b) | crc32.Checksum(b, crc32.MakeTable(crc32.Castagnoli)) | uint32 |
| 浏览器 JS | 无内置,常见手写实现末尾 ^ -1 | — | 常为有符号,需要 >>> 0 |
对拍时记住:这些函数算的都是 CRC-32(zip 口径),与本页变体表第一行一致;hex 写法请自己补齐 8 位。
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 | 英文语境下的同一件事 | 整页 |