我们以绘制一个存储字符串“QR”的Version 1-L二维码为例,演示从零构建过程。虽然实际中不会手绘,但理解它才能真正掌握原理。
步骤1:确定参数
- 数据内容:“QR”
- 版本:Version 1(21×21模块)
- 纠错等级:L级(7%)
- 编码模式:字母数字模式(Q=26, R=27)
步骤2:编码转换
“QR”的字母数字编码过程
字母数字映射表:
A=10, B=11, ..., Z=35, 0=36, ..., 9=45, $=46, %=47, =48, +=49, -=50, .=51, /=52, :=53, space=54, $=55, %=56, &=57, =58, -=59, .=60, /=61, :=62
Q=26, R=27
组合:26×63 + 27 = 1665(因每组2字符,不足补0)
转二进制:1665 = 11010000001(11位)
填充至8位倍数:11010000001 + 0000 = 110100000010000(16位)
添加结束符:0000(4位)
→ 最终二进制串:1101000000100000000(20位)
步骤3:生成纠错码(简化演示)
实际计算需用多项式除法,这里用工具结果简化:
数据码字:[10100000, 01000000](十进制:160, 64)
纠错码字(L级,2字节):[221, 153]
步骤4:填充矩阵(关键步骤)
按Z字形填充,避开固定区域(定位图案、时间序列):
Version 1 矩阵填充示意图(部分)
初始网格(21×21):
1111110
1000001 0000001 0000001
1011101 0111101 0111101
1011101 0111101 0111101
1011101 0111101 0111101
1000001 0000001 0000001
1111110 1111110 1111110
0000000 0000000 0000000 ...(其余区域)
填充顺序:从右下角开始,每列2位,Z字形移动
步骤5:选择掩码( Penalty计算)
计算8种掩码的罚分,选最低者。以掩码0((i+j)%2==0)为例:
Penalty = 1×(连续同色>5模块数) + 2×(2×2块数) + 3×(比例失衡) + 4×(定位干扰)
掩码0罚分:32
掩码1罚分:48
...
最优掩码:掩码3(罚分18)
→ 最终矩阵与掩码3异或
步骤6:写入格式信息
纠错等级L=01,掩码=011
格式信息 = 01011 + BCH(01011) = 010110101001110
写入:左上定位图案下方(7格) + 右上+左下定位图案周围(8格)
手绘验证技巧:
1. 先画定位图案(3个7×7回字形)
2. 再画时间序列(7条黑白交替线)
3. 填充剩余区域(注意避开已占位置)
4. 检查格式信息位置是否正确
5. 用手机扫描测试——即使手绘不完美,只要逻辑正确,多数APP仍可识别!