1. 什么是 Reed-Solomon 纠错?
Reed-Solomon(RS)纠错由数学家 Irving S. Reed 和 Gustave Solomon 于 1960 年发明,是一种非二进制循环纠错算法,广泛应用于航天通信(NASA 旅行者号)、CD/DVD 光盘、卫星电视,以及二维码所遵循的 ISO/IEC 18004 标准。
Reed-Solomon 码不只是检测错误(像简单的奇偶校验位或 CRC 校验和那样),它会生成冗余的数学校验块,能够精确定位受损字节模块的位置,并重建原始内容数据,无需重新请求传输。
2. 二维码的 4 个纠错等级
ISO/IEC 18004 标准规定了四个可选的纠错码(ECC)等级。每个等级表示在二维码无法识别之前,全部码字中可以被毁坏或遮挡的百分比:
| ECC 等级 | 恢复能力 | 码点密度 | 推荐用途 |
|---|---|---|---|
| L 级(低) | 约 7% 的数据 | 密度最低(方块最少) | 数字屏幕,以及内容数据量大、二维码又必须保持小巧的场合。 |
| M 级(中) | 约 15% 的数据 | 均衡的标准选择 | 一般网址、包装、传单和营销印刷品的默认选择。 |
| Q 级(四分之一) | 约 25% 的数据 | 中等密度 | 最适合自定义 Logo、桌牌以及容易磨损的环境。 |
| H 级(高) | 约 30% 的数据 | 密度最高(方块最多) | 户外广告牌、工业标签,以及物理损耗严重的环境。 |
3. 嵌入 Logo 如何利用纠错能力
当您在二维码中央放置 Logo 或图标时,扫描器的光学传感器会把 Logo 当作表面物理损伤或缺失的码点。
由于 Q 级纠错最多可恢复 25% 的损坏数据,H 级最多可恢复 30%,Reed-Solomon 数学解码器能计算出 Logo 下方缺失的码点,并在几毫秒内重建原始网址。
带 Logo 二维码的黄金法则:
- 最大面积:Logo 占用的面积绝不要超过二维码总面积的 20% 到 25%。
- 保护 3 个定位角:绝不要让 Logo 遮住或碰到左上、右上和左下角的三个大方形定位角(码眼)。
- 使用白色留白:始终在 Logo 周围画一圈纯白的保护边距,防止周围的码点与 Logo 图形混在一起。
- 自动切换到 Q 级或 H 级:每当您上传自定义 Logo,qr-code.love 都会自动把纠错等级提升到 Q 级或 H 级。
4. 伽罗瓦域 GF(256) 中的数学流程
在您浏览器中运行的编码器,在一个包含 256 个元素的有限域中进行运算,记作 GF(28) 或 GF(256)。每个字节都是该域中的一个元素,乘法按以下本原多项式取模定义:
数据字节被视为多项式 D(x) 的系数。引擎将其乘以 xE(E 为该等级所需的纠错码字数量),再用该等级固定的生成多项式 G(x) 去除。除法的余数就是校验数据:这 E 个字节会放在二维码中数据的后面。
5. ISO 规定的 8 种掩模图案与罚分计算
纠错码字计算完成后,如果把原始二进制字节直接放进网格,可能会意外形成大片全黑或全白的码点,或者形成会迷惑相机光学传感器的假“定位图案”。
为解决这个问题,ISO/IEC 18004 标准会在网格上应用 8 种候选的 XOR 数学掩模图案。引擎用一套严格的罚分公式为每个加掩模后的候选结果打分:
- 罚分 1(相邻码点连续):同色码点连续 5 个或以上时加 3 分,超过 5 个的部分每多一个再加 1 分。
- 罚分 2(2x2 码点块):每个同色 2x2 方块加 3 分。
- 罚分 3(假定位图案):任何符合 1:1:3:1:1 比例的码点序列加 40 分。
- 罚分 4(深浅比例失衡):偏离 50/50 平衡时按比例加分。
累计罚分最低的掩模图案会被选中,并编码到定位图案周围的格式信息位中。
6. 应对真实环境损耗的能力
对于会受到风吹日晒或磨损的实体物料,选择合适的纠错等级至关重要:
| 环境条件 | 推荐 ECC | 典型损坏风险 |
|---|---|---|
| 户外广告牌与金属标牌 | H 级(30%) | 紫外线褪色、雨水痕迹、锈蚀和鸟粪。 |
| 餐厅桌牌与菜单 | Q 级(25%) | 食物洒落、手指污渍和酒精消毒剂。 |
| 产品包装与标签 | M 级(15%) | 轻微的表面摩擦和搬运刮痕。 |
| 数字屏幕与电视播放 | L 级(7%) | 没有物理磨损;优先追求最少的像素数量。 |
7. 各版本的数据码字与纠错码字
每个版本的码字数量固定,每个码字 8 位,纠错等级决定其中多少承载您的数据、多少承载恢复数据。前三个版本的情况如下。
| 版本 | 总数 | L(数据 + 纠错) | M | Q | H |
|---|---|---|---|---|---|
| 1 | 26 | 19 + 7 | 16 + 10 | 13 + 13 | 9 + 17 |
| 2 | 44 | 34 + 10 | 28 + 16 | 22 + 22 | 16 + 28 |
| 3 | 70 | 55 + 15 | 44 + 26 | 34 + 36 | 26 + 44 |
数据码字并不全是内容数据。最前面的几位存放模式指示符和字符计数,在字节模式下,版本 9 及以下占 12 位,版本 10 起占 20 位。这就是为什么 L 级的版本 1 二维码只能容纳 17 个字节而不是 19 个字节的数据。
在 H 级下,从版本 1 开始恢复数据就多于内容数据。这正是 Logo 选项提高等级时所做的取舍:可用字节更少,换来的是即使被部分覆盖也依然能识别的二维码。