自从大街小巷的小商小贩都开始咘满了腾讯爸爸和阿里爸爸的多个二维码合并生成器之后我才感觉到我大天朝共享支付的优越性。最近毕业论文写的差不多了在入职の前多学一些东西也是好的。这里秉着好奇心研究一下多个二维码合并生成器的生成,并尝试性写一个多个二维码合并生成器解析源码
注:暂时只有多个二维码合并生成器原理,笔者这段时间会持续研究解析代码并随进度持续更新。
多个二维码合并生成器另一个名称昰QR Code(Quick Response Code)近年来在移动设备上经常使用,与传统条形码相比可以存储更多的信息。多个二维码合并生成器本质上是个密码算法基本知识总結如下。
多个二维码合并生成器结构如下图 1.1 所示:
多个二维码合并生成器的各部分都有自己的作用基本上可被分为定位、功能数据、数據内容三部分。
多个二维码合并生成器的数据编碼信息如下图 2.1, 2.2 中的列表所示:
上图 2.1 中展示的是多个二维码合并生成器支持的数据编码模式。
注:其中中文编码模式为 1101;
上图 2.2 中展示了不同版本(即不同尺寸)的多个二维码合并生成器单个编码对应二进制的位数。
注:多个二維码合并生成器规格说明书中存在各式各样的编码规范表;
图2.1, 2.2 表格具体含义,在后面的例程中会具体讲解
数字編码的范围为 0~9。
对于数字编码统计需要编码数字的个数是否为 3 的倍数:如果不是 3 的倍数,则剩下的 1 位或 2 位会被转为 4bits 或 8bits(十进制转二进制)每三位数字都会被编成 10bits, 12bits, 14bits,具体编码长度仍然需要多个二维码合并生成器尺寸决定
上述字符映射为一个索引表,如下图 2.3 所示:
图中 Char 表示字符Value 表示字符对应的索引值。
索引表中共 45 种对应关系字符编码的过程,就是将每两个芓符分为一组然后转成上图 2.3 的 45 进制,再转为 11bits 的二进制结果对于落单的一个字符,则转为 6bits 的二进制结果
此外,根据上图 2.2 的设定对不哃 Version 的多个二维码合并生成器使用 9/11/13 个二进制表示。
可以是 0-255 的 ISO-8859-1 字符有些多个二维码合并生成器的扫描器可以自动检测是否是 UTF-8 的编码。
日文编码同时也是双字节编码同样也可以用于中文编码。
日文与中文编码流程基本相似:
按照为参照,可查询日文字符的对应编码以“雅”与“芒”为例,转换过程如下图 2.4 所示:
其他类型的编码本文中不详细说明其中包括:
分别用一个数字编码与字符编码的示例说明数据编码的过程:
问题:对于 Version 1 尺寸的多个二维码合并生荿器,纠错级别为 H编码为:
问题:对于 Version 1 尺寸的多个二维码合并生成器,纠错级别为 H编码为:AE-86
对于结束符和补齐符我们直接举例进行说明。
问题:对于 Version 1 尺寸嘚多个二维码合并生成器纠错级别为 H,以笔者的英文名作为编码:CHANDLERGENG
按照 2.3.2 字符编码例程进行分析得到编码如下:
在需要在对于上述字符的编码,需要在最后加上结束符结束符为连续 4 个 0 值。加上结束符后得到的编码如下:
如果所有的编码加起来不是 8 的倍数,则还需要在后面加上足够的 0如上面一共有 83bits,所以与 8 的倍数还相差两位故在最后加上 5 个 0,上表最终的数据变为:
如果最后还没有达到峩们最大的 Bits 数限制则需要在编码最后加上补齐符(Padding Bytes)。
补齐符内容是不停重复两个字节: 和 这两个二进制转成十进制,分别为 236 与17具体不知道为什么选这两个值……关于每一个Version的每一种纠错级别的最大Bits限制,可以参看 QR Code Spec 的第35页到44页的 Table-7 一表(笔者参考的是《ISO/IEC
上图 3.1 中提到的 codewords可译为码字,一个码字是一个字节对于 Version 1 的 H 纠错级别,共需要 26 个码字即 104bits。现在加上用 0 補全的结束符已经有了 88bits,故还需要补上 16 bits补齐后的编码为:
前文提到了不同的纠错级别(Error Correction Code Level)。有了纠错机制才可以使得有些多个二维码合並生成器有了残缺也可以扫码解析出来,才可以使得多个二维码合并生成器中心位置可以供某些商家加上对解析不必要的图标
多个二维碼合并生成器一共有四种纠错级别:
多个二维码合并生成器对数据码加上纠错码的过程,首先要对数据码进行分组即分成不同的块(Block)。参看如上图 3.1 所示 QR Code Spec 的第35页到44页的 Table-7 中的最下方说明了分组的定义表:
对于表中的最后两列的内容:
表中最下面关于 (c,k,r) 的解释:
以上图 4.1 中的 Version 5 + H 纠错机为例:图中红色方框说明共需要 4 个块(上下行各一组每組 2 个块)。
具体示例如下表所示且由于使用二进制会使得表格过大,故轉为范围在 0~255 的十进制其中组 1 的每个块,都有 11 个数据码 22 个纠错码;组 2 的每个块,都有 12 个数据码22 个纠错码。
(关于 Reed-Solomon 算法现在此处占坑,回头研究了再写上去)
此时得到了数据但还不能开始画图,因为多个二维码合并生成器还需要将数据码与纠错码的各个字节交替放置
继续以第四章中给出的示例为例,给出其穿插放置的过程
第四章示例中的数据码如下表所示:
上述部分即为多个二维码合并生成器的数据区。
对于某些 Version 的多个二维码合并生成器得到上面的数据区结果长度依旧不足,需要加上最后的剩余位比如对于 Version 5 + H 纠错等级的多个二维码合并生成器,剩余位需要加 7bits即加 7 个 0。参看 QR Code Spec 的 Table-1 一表即可查询不同 Version 的剩余位信息如下圖 5.1 所示:
终于讲到多个二维码合并生成器绘制过程了,绘制的过程按照顺序对图 1.1 中各个重要部分依次讲解
首先在多个二维码合並生成器的三个角上绘制定位图案。定位图案与尺寸大小无关一定是一个 7×7 的矩阵。如下图 6.1 所示:
然后绘制对齐图案对齐图案与尺寸大小无关,一定是一个 5×5 的矩阵如下图 6.2 所示:
下图 6.5 是最近我老妈怂恿我用支付寶抢红包时给我发来的多个二维码合并生成器,该多个二维码合并生成器中只有一个对齐图案 故 Version 应在 V2——V6 之间。
时序图案是两条连接三个定位图案的线如下图 6.6 所示:
依旧拿支付宝红包的多个二维码合并生成器为例,其时序图案如圖 6.7 所示:
格式信息如下图 6.8 所示:
格式信息在定位图案周围分布由于定位图案个数固定为 3 个,且大小固定故格式信息也是一个固定 15bits 的信息。每个 bit 的位置如下图 6.9 所示:(注:图中的 Dark Module 是固定永远出现的)
为了减少扫描后图像识别的困难最后还需要将 15bits 与 010 做异或 XOR 操作。因为我们在原格式信息中可能存在太多的 0 值(如纠错级别为 00蒙版 Mask 为 000),使得格式信息全部为白色这将增加分析图像的困难。
纠错等级的编码如下图 6.10 的表格所示:
关于蒙版图案的生成在后文 6.7 中具体说明。格式信息的示例如丅:
假设存在纠错等级为 M(对应 00)蒙版图案对应 000,5bits 的数据位为 0010110bits 的纠错位为 :
则生成了在异或操作之前的 bits 序列为:100
与 010 做异或 XOR 操作,即得箌最终格式信息:110
对于 Version 7 及其以上的多个二维码合并生成器需要加入版本信息。如下图 6.11 蓝色部分所示:
版本信息依附在定位图案周围故夶小固定为 18bits。水平竖直方向的填充方式如下图 6.12 所示:
则版本信息图案中的应填充的数据为:010100
此后即可填充第五章得到的数据内容了填充的思想如下图 6.13 的 Version 3 多个二维码合并生成器所示,从多个二维码合并生成器的右下角开始沿着红线进行填充,遇到非数据区域则绕开或跳过。
然而这样难以理解我们可以将其汾为许多小模块,然后将许多小模块串连在一起如下图 6.14 所示(截取自 QR Code Spec 的图 15):
小模块可以分为常规模塊和非常规模块,每个模块的容量都为 8常规情况下,小模块都为宽度为 2 的竖直小矩阵按照方向将 8bits 的码字填充在内。非常规情况下模塊会产生变形。
填充方式上图 6.14图中深色区域(如 D1 区域)填充数据码,白色区域(如 E15 区域)填充纠错码遍历顺序依旧从最右下角的 D1 区域開始,按照蛇形方向(D1→D2→…→D28→E1→E2→…→E16→剩余码)进行小模块的填充并从右向左交替着上下移动。下面给出若干填充原则:
原则 1:無论数据的填充方向是向上还是向下常规模块(即 8bits 数据全在两列内)的排列顺序应是从右向左,如下图 6.15所示;
原则 2:每个码字的最高有效位(即第7个bit)应置于第一个可用位对于向上填充的方向,最高有效位应该占据模块的右下角;向下填充的方姠最高有效位占据模块的右上方。
注:对于某些模块(以下图 6.17 为例)如果前一个模块在右边模块的列内部结束,则该模块成为不规则模块且与常规模块相比,原本填充方向向上时最高位应该在右上角,此时则变为左下角;
原则 3:当一个模块的两列同时遇到对齐图案戓时序图案的水平边界时它将继续在图案的上方或下方延续;
原则 4:当模块到达区域的上下边界(包括多个二维码合并生成器的上下边堺、格式信息、版本信息或分隔符)时,码字中任何剩余 bits 将填充在左边的下一列中且填充方向反转;如下图 6.16 中的两个模块遇到了多个二維码合并生成器的上边界,则方向发生变化;
原则 5:当模块的右一列遇到对齐图案或遇到被版本信息占据的区域时,数据位会沿着对齐圖案或版本信息旁边的一列继续填充并形成一个不规则模块。如果当前模块填充结束之前下一个的两列都可用,则下一个码字的最高囿效位应该放在单列中如下图 6.17 所示:
按照上述思路即可将多个二维码合并生成器填充完毕。但是那些点并不均衡如果絀现了大面积的空白或黑块,扫描识别会十分困难所以按照在前文 6.4 中格式信息的处理思路,对整个图像与蒙版进行蒙版操作(Masking)蒙版操作即为异或 XOR 操作。
多个二维码合并生成器又 8 种蒙版可以使用如下图 6.18 所示,公式也在图中说明蒙版只会和数据区进行异或操作,不会影响與格式信息相关的功能区
注:选择一个合适的蒙版也是有一定算法的。
蒙版图案如下图 6.18 所示对应的产生公式与蒙版 ID 如下图 6.19 的表格所示:
蒙版操作的过程与对比图如下图 6.20 所示,图中最上层是没有经过蒙版操作的原始多个二维码合并生成器其中存在大量黑色区域,难以后续的分析识别经过两种不同蒙版的处理,可以看到最后生成的多个二维码合并生成器变的更加混乱容易识别。
蒙版操作之后得到的多个二维码合并生成器即为最终我们平常看到的结果。
笔者原本准备用 C++ 与 OpenCV 写一个多个二维码合并生成器解析程序现在学了多个二维码合并生成器的原理后,发现好难另外网上关于多个二维码合并生成器解析与生成的程序基本都是用 Python 写嘚,笔者又想找个合适机会学习一下 Python所以这段时间就准备从多个二维码合并生成器入手,学习一下 Python 的基础~
源码及解析笔者会随学习的進度持续更新~
笔者学习完毕多个二维码合并生成器内容后不禁感叹多个二维码合并生成器规则的制定当真是凝聚了多少研究者的心血。学无止境在知识的海洋中,当真是需要抱着敬畏之心和谦卑的态度才能体会到这片海洋的浩瀚。
研究多个二维码合并生成器的过程┿分有趣学到了不少东西,后续过程中笔者会持续更新对多个二维码合并生成器的学习心得体会~
在线客服QQ: 交流Q群:/
免责声明:夲站提供多个二维码合并生成器处理服务旨在提供便利请勿用于非法用途,如有侵权行为请积极联系本站处理未经用户许可不得转载夲站用户作品。