如何解读ISO/IEC 18004:2015标准表9的纠错块数量划分
QR码纠错块划分(版本5+)核心逻辑与操作步骤
先澄清表9的格式误解
你看到版本5及以上“纠错块数量”单元格的多组数字,本质是按L/M/Q/H纠错等级顺序,依次存储每个等级的「块结构参数」,而非混乱的无意义序列:
- 版本4及以下:每个纠错等级的块结构简单(所有块数据码字数相同),所以单元格仅存储4个数字,分别对应L/M/Q/H的总块数。
- 版本5及以上:部分等级的总数据码字数无法被总块数整除,需要将块分为两组(每组内块的 data codewords 数量一致),因此每个等级的参数需要2个数字(总块数 + 单块数据码字数,当可整除时)或4个数字(第一组块数 + 第一组单块数据码字数 + 第二组块数 + 第二组单块数据码字数,当不可整除时),多个等级的参数连写就形成了长数字序列。
比如你提到的版本5的“1,2,2,2,2,2”,实际是按L/M/Q/H顺序的简化参数:
- L等级:1组,2块,每块101个数据码字
- M/Q/H等级:各1组,2块,每块分别为86/71/56个数据码字
(注:实际标准表9中版本5的参数应为2,101,2,86,2,71,2,56,你看到的是简化后的块数序列)
通用块划分步骤
不管版本高低,按以下流程划分数据码字:
- 查表获取核心参数:从表9提取当前版本+纠错等级对应的:
- 总数据码字数
D - 总纠错码字数
E - 总块数
N - 块组参数(若分两组则为
n1, k1, n2, k2,其中n1+n2=N,n1*k1 +n2*k2=D;若不分组则n1=N, k1=D/N)
- 总数据码字数
- 分配数据码字:
- 若不分组:直接将数据序列平均分成
N块,每块k1个码字 - 若分两组:先取
n1个块,每个块分配k1个码字;再取n2个块,每个块分配k2个码字(通常k1 = k2 +1,保证总字数等于D)
- 若不分组:直接将数据序列平均分成
- 生成纠错码字:每个块单独生成
E/N个纠错码字(总纠错码字数E必然能被总块数N整除,标准已预先定义)
实例演示(版本5,纠错等级H)
- 查表参数:
D=112,E=120,N=2,k1=56(可整除) - 划分:将112个数据码字分成2块,每块56个
- 纠错:每个块生成60个纠错码字(120/2=60)
- 后续:将块数据和纠错码字按标准规定的交织顺序排列(此步骤不属于块划分范畴)
无分组/分组的判断逻辑
如果总数据码字数D能被总块数N整除,则所有块大小一致;否则必然分成两组,分组参数可通过公式推导:
k1 = D // N # 基础块大小 remainder = D % N n1 = remainder # 大尺寸块的数量(每块k1+1个码字) n2 = N - remainder # 小尺寸块的数量(每块k1个码字)
这个公式和标准表9的参数完全一致,可用来验证查表结果。
内容的提问来源于stack exchange,提问作者stackdaemon
相关产品推荐
相关产品推荐

