书接上文,下面就该纠错码分块了。
包括填充数据在内的数据字应该被拆分到各个纠错块中。如表9中定义。纠错码应该在计算生成后添加到数据块的后面。
注意 micro qr 只有一个块
QR Code的多项式运算应该遵循,按位计算 2模,按照字节运算要模100011101,下面时按照2的八次方展示100011101的展示
数据序列的码字会从高位至低位成为系数。编码在第一个纠错码之前。
生成多项式的运算过程是按照附录A中提到的 多项式数据去除数据多项式的结果。
生成多项式可以按照说明14中的实例,进行电流循环除法运算,从b0到b k-1都是使用0来初始化. 生成编码的过程可以被分为两个阶段,第一个阶段,图中的两个开关都是向下的那个位置。第一阶段的结束 是伴随着N次的 块的脉冲。 第二个阶段开始,我们就拥有了一个(n+1 ... n+k)的脉冲块了,然后我们通过保持input data一直是0,就可以得到纠错码字了。
7.6 构建最终的消息字节序列
消息的字节数必须始终与表7 表9中关于容量的约束。构造最终的消息字节序列需要下列几个步骤(消息+纠错码+填充码 如果需要)
第一步 按照表9中的约定,将数据序列分组拆分到各个 模块之间(对于MICRO来说只有一个模块)
第二步 对各个数据块,分别计算纠错码 按照7.5.2和附件A中的约定
第三步 将各个数据块的 数据和纠错码取出,并且重新拼接到一起。 举例,比如现在有四个数据块序列,那么他们的顺序是 块1的第一个字节,块2 的第一个字节.......块1的第1个字节,块2的第一个字节,以此类推。二维码的符号包含的数据和纠错码信息刚刚好填充满整个符号。但是在某些版本可能不能刚刚整除8,所以可以需要3,4,7个填充的比特添加到消息后用来填充编码区域。
最短的数据块应该放到最前面,纠错码放到数据块后面。举个例子在5-H版本符号中,包含了四个数据和纠错码的数据块,前两个包含着11个数据字和22个纠错码字,后两个包含的是12个数据字和22个纠错码字,他们的变化过程可以参看说明15. 每行的数据字(用Dn标识)都在纠错字的前面(用En标识)字符的序列关系是按照每列从上向下来回反复。
版本5-H 最终消息的字节序列是这样的:
D1 D12 D23 D35 D2。。。。
这个序列在最后面需要添加七个0作为填充位。
7.7 矩阵中字的放置
7.7.1 符号字符的标识方式
符号字符这里有两种表示方法,有规律的和没有规律的两种。在QR符号中,他们的区别在于他们在符号中的位置,和与符号中其他字符以及功能模式的位置。
大多数字都会被2x4的模点所表示,针对这些模点块有两种方志方法,也就是横竖2x4和4x2的区别。
没有规律的模点块主要是在发生方向变化或者是在标记或者其他功能区域附近导致的。具体的例子可以参看说明16,17和18
7.7.2 功能符号放置
首先应该按照使用的版本构造一个空的横竖相关的方形空矩阵。根据位置信息对定位符,分割线,终止符,修正符等添加上亮色或者暗色模点。 格式信息和版本信息的模点位置应该被先临时置空。
这些被临时置空的位置在 说明19和20中有表示。 对于所有的版本来说是通用的(尽管版本1-6不是这样。)附件E中定义了这些区域的位置
7.7.3 符号字符的放置
在二维码符号的编码区域,字符符号的位置是由两个模点宽度的,从右下角开始,蛇行向上左转。他们所需要遵循的原则看下面。 说明19和说明20. 用图示的方式说明了版本2和版本7如何应用这些规则。
a) 一行比特序列应该遵循从右向左的原则,不是向上就是向下,具体要根据符号字符的方向
b) 字节中最有意义的比特(比如bit7)应该被放到第一个可以使用的模点位置,剩下的比特放到下一个模点位置。因此在上升的情况下,最有效比特会出现在 右下角,在下降的方向下,最有效比特会出现在右上角。
在不规则的模式下,如果上一个占据了右手边的位置,那么最有效比特是可以从左边开始的。(参看说明18)
说明16:规则模式下,上方向和下方向的比特放置示意图
c) 当一个符号字符遇到 校正符号或者终止符号的横向边界时,在所有的模点杭商,都应该按照编码区域向上或者向下继续。(向上向下取决于当时的方向,这句话是我自己的理解)
d) 当遇到纵向,也就是向上向下的边界时(比如遇到符号的边界,格式信息区域,版本信息区域或者间隔符号)剩下的比特应该向左一行继续,方向反转。
说明17 规则符号放置和不规则符号放置的方向转换
e) 有的时候会因为矫正符号或者版本符号导致右手边的行被占用,此时比特们会被用非规则的形式所展示,他们只会只用一行模点来使用矫正符号或者版本符号。 如果当前字符结束前还没有遇到两行可用的情况。那么下一个字符继续占用单行。
说明18 比特放置适应修正符号的样例
另外一种放置方法,可以获得同样的结果,那就是将每个字视为单独的比特序列,来进行放置(当然还是从最有效比特开始)在两个模点宽度的行之间,按照上下方向进行左右切换。并且跳过被功能区域所有冲突的位置。徐磊中的每个元素会被放到第一个可以使用的模点位置
如果符号的数据容量不能被8比特整除,那么需要添加上填充位的比特(3,4或者7个,具体看表1中的约定)这些位置在进行数据遮罩前一律填写0,具体参考7.8章节。
说明19: 2-M版本下的字符范围
说明12: 7-H版本下的字符展示区域
MICRO-QR一样适用于这些规则,但是他们没有不规则字符的概念,仅仅在M1版本的D3位置,M3-L版本的D11位置和M3-M版本的D9位置 由一个2x2的方形模块。
7.8 数据遮罩
7.8.1 概述
为了保证二维码可以被可靠的古曲,亮色和暗色之间最好可以有一个比较好的分布形态。比如 模点1011101有可能会被识别为一个定位符号,为了避免这种情况,我们应该使用数据遮罩,按照下面讲的步骤。
1 数据遮罩层 不会适用于功能区域
2 根据给定的模式,对各个矩阵模式,对编码区域进行转换(版本信息和格式信息不包含在内)xor操作。所谓的xor操作,就是将矩阵中和遮罩层为黑色的进行反转运算。
3 尝试所有的遮罩模式,并且打分。打分通过检查不良的特征点。
4 选择分数最低的模式。
7.8.2 数据遮罩模式
表中约定了数据遮罩的相关运算(在使用某种格式下的数据遮罩切换)和数据遮罩层的生成条件。数据遮罩层起作用的情况,是在编码区域内任何暗色模点的生成条件为true的情况(编码区域的意思是除了功能区域外的其他区域)。 公式中的i 是行,j 是列。最左上角的坐标是0,0
说明21展示了所有的数据遮罩层,并且图解了版本为1的情况
说明23 模拟了数据遮罩层从000 到 111的过程。
备注1 下方标记得三个比特就是其引用
备注2 标记下面得公式,标识了其中得黑色模点生成得条件
说明22 下面展示了应用于M-4版本得MICRO QR版本得四种可能得数据遮罩层
7.8.3 评估数据遮罩后得结果
7.8.3.1 计算qr符号
在对数据模块,进行各个模式得遮罩操作之后,需要对其分别积分,记录其中不好的点数,不好的情况主要是以下特征,得分越高,对应的数据遮罩的可接受程度就越差。下面的表11中,变量N1至N4代表了不良得分的权重(N1 = 3,N2 = 3,N3 = 40,N4 = 10),i是连着超过五个模点同色的元素,k代表了符号中黑色模点偏离的比例,从50%开始,5%为步长,依次增加。 虽然遮罩层只作用于编码区域,但是评估过程是按照整个来的。
1 横竖相邻的色块同色的数量 超过五个 5+i N1(3) + i
2 2x2的同色 2x2的忽略 N2(3)
3 1:1:3:1:1 黑白黑白黑 N3(40)
4 50%上下的黑色块数量 超过50%的 5的倍数 10*i
说明1 在横纵方向上有相同颜色的色块
在横纵方向上检查 黑色或者白色的色块。有连续超过五个的模点,并且对数据遮罩后的模点矩阵进行评估。每当有五个连续同色模点时,添加三点坏点数值,如果有六个同色,则添加四点。以此类推。已经统计过的坏点处,不能重复统计,比如七个黑色点,是5分,而不是12分。
说明2 同色模点块
同色模点块用来统计,2x2的同色模点块,如果是3x3的同色模点快,则需要积分为12 4(个2x2的模点块) X 3分 = 12个坏点分
说明3 横纵方向上 1:1:3:1:1的特征点
如果存在1:1:3:1:1 的特征模点,并且其前后存在四个白色的亮点,则增加40分坏点数值
说明4 黑色模点在整个符号中所占的比例
黑色模点比例在45% 到 55%之间,以50%作为基准点,每偏移5%,增加五分。在40%-60%之间,每偏移5%,增加10分。
最终选择的数据遮罩层是坏点积分结果最低的那个数值。
7.8.3.2 对于MICRO -QR格式的评估
在对整体数据,应用完数据遮罩操作之后,对于分数的评估是通过对 并非终止符号的两边,的黑色模点进行计数。得分越低,越不可接受。 因为如果黑色点阵数量多可以更有效的区分编码区域和静默区域(除了包含终止符好的最终模点符号以外)。最终的得分由下面的公式计算得出:
如上图
SUM1 是右侧的黑色模点数
SUM2 是下面的黑色模点数
说明24 MICRO QR格式的遮罩结果评估
最高得分的数据遮罩应该被采用。
7.9 格式信息
7.9.1 QR CODE 符号
格式信息是一个15比特的序列,其中包含5个数据序列和10个纠错比特序列,使用的是(15,5)的BCH编码。对于纠错码生产部分的详细信息参考附录3,前两个数据比特会包含符号的纠错码级别,在表12中定义。
第三个到第五个格式信息里面的比特,用来标识数据遮罩的模式信息,表10中提到的。 按照7.8.3的编码约定。
十个纠错比特会根据附录C的描述跟在5个数据比特后面
15个比特纠错码格式信息应该被XOR操作,和 掩码 101010000010010, 为了保证不会出现类似全零的数据字符串。
最终得到的结果应该被嵌入指定区域,按照说明25中的描述,值得注意的是,格式信息在符号中会出现两次,为了提供必要的冗余。最低有效位,放在0的位置, 最高有效位放在14的位置。 有一个特殊的小黑点,(4V+9,8)这是一个永远是黑色,且不属于格式信息的一个模点位置。
说明15 上图是个例子。需要特别指出的是,在主流的编码软件中,左上角的格式信息是按照大端排序的,这样的后果就是,整个符号横过来了。(这段是我自己加的)
7.9.2 MICRO QR符号
15个比特内容组成和规则和 QR CODE一致,具体看上面
表13
这里的内容和7.9.1 一样,不做重复翻译。
如图,只是格式信息只存了一份
MICRO-QR 符号的样例
7.10 版本信息
版本信息只会存在于版本7以及以上。它是一个18比特序列构成,其中六个数据比特,12个纠错码比特。他们由(18,6)的多兰码计算得出。具体的生成细节,参考附录D。 六个数据庇古特用来标识符号的版本,大端模式。
12个纠错比特按照附录D的描述进行计算,然后添加到六个数据比特之后。
如果没有版本信息,将会被全0的数据字符串填充,只有版本为7-40的符号由版本信息。 数据遮罩不会应用于版本信息。
最终的版本信息应该按照说明27中的说明,嵌入到符号中。版本信息也会被嵌入两次,为了保证解码时由必要的冗余。 最小端的比特放在0的位置,最大端放在17的位置。如说明28表示。
说明27
说明28