上回书咱们说道,第六章,下面从第七章开始继续
7 环境需求
7.1 编码流程概览
下面的内容介绍了 输入的数据转换为二维码符号的过程
步骤1 数据解析
要将输入的数据流,识别为其中待编码的各种字符集。QR标准(不是MICRO)支持扩展渠道功能,这样可以使得默认字符集之外的内容可以被编码。QR CODE支持多种模式,使得多种字符内容可以被有效率的编码(具体看7.3章节)。 在将字符编码为二进制字符串之前,有必要对其编码模式进行切换,找到最佳的模式。 选择纠错码级别。 如果用户没有手动制定版本,那么我们需要采用能容纳这些的数据的最小版本。完整的版本列表,查看表1
步骤二 数据编码
将字符按照 7.4.2和7.4.6的规则,强制转换为比特流。在每个模式片段之前插入模式标识,在编码数据的结尾要加上结束符号。 然后将字符流分割为8BIT一组,并且根据版本要求的 数据 codeword数量,对其他位置进行填充。
步骤三 纠错码编码
将编码完成的字 按照要求的块数量分散开(表9中有定义),来保障纠错算法可以实施。为每一个块 生成纠错码字,将纠错码的字添加到字的尾部。
步骤四 重构最后的信息
按照7.6(步骤三)的说明将各个模块的数据和纠错码进行织入,如果需要填充上剩余位置。
步骤五 矩阵转换
将所有的字进行定位,并且添加定位符,分割线,匹配符,如果需要还要加上校正符。
步骤六 数据遮罩
将数据遮罩应用到编码区域,在选择数据遮罩模式的时候需要考虑黑白像素之间的评价,最小化符号之间的冲突。
步骤七 格式和版本信息
生成格式和版本信息(在可添加)的地方,并且完成二维码的绘制。
table1
7.2 数据解析
解析输入的数据串来决定是采用默认或者是扩展的ECI模式来解析内容。具体的编码方式可以看7.4章节的描述。从数字模式转换为日本字模式,每个字符都需要更多的比特空间。所以我们需要在一个符号编码切换到另外的编码,来尽可能减少比特数据流的长度。这样至少其中的某一部分或者几个部分可以更有效率的。比如 数字序列可以按照数字文本模式解读。理论上最有效率的模式是每个数据字符需要最小的比特长度的,但是有些时候模式的指示符号会被跳过,而且这个和每次模式切换的字符长度有关。在一些最短暂的比特流字符串可能不会被此都会转换。并且因为二维码的数据容量的增长步骤和版本是分离的,所以我们可能没必要每次都以最有效率的方式解析。
对于使用最小的比特流长度的说明文档请看 axnex 1,在Micro qr符号上,也提供了在更小的版本上可以使用的模式约定, Axnexj.2 说明了 micor qr 如何在众多的组合中和选取最适合两种模式组合。
7.3 模式
7.3.1 普通模式
下面定义的模式,是基于字符本身的数值,并且由默认的ECI进行字节分配。当另外一个ECI被强制指定(只存在于QR Code模式中)时,byte的数值除了制定的字符分配模式外,还需要自主选择更合适的压缩模式。举个例子,当一串字符串完全由30-39之间的十六进制组成时,这个时候应该使用纯数字模式,这种时候的压缩模式,应该使用数字或者字母的压缩模式。
7.3.2 扩展模式
扩展渠道说明协议由AIM公司确定。国际技术标准允许允许输出的数据流与默认的字符集不同。 ECI 协议在很多数字符号中是一致的,他提供了一致的方法在打印和解析之前对字节数据进行解释。ECI 不被MICRO QR支持。
QRCode的默认ECI 是000003 意思是iso8859-1字符集
使用其他字符集国际标准需要使用ECI协议,比如JIS8 和Shift JIS8 使用的是ECI000020
ECI的工作模式,是在该数据中插入一个转义字符,后面一般会跟着其他的模式标识(比如标识数据)这个字符会一直生效,知道消息结束,或者遇到另外一个转义字符。
7.3.3 数字模式
数字模式由纯数字(0-9)或者字节数据(16进制30-39)。通常三个数字字符被10个bit标识。
7.3.4 数字文本模式
数字文本模式由45个字符集合内的数据编码而成。包括 十个数字 0-9(30-39 hex)26个字符(A-Z)(41-5A HEX),以及9个符号(SP,$,%,*,+,-,./,:)(20,24,25,2A,2b,2d-2f,3a HEX).正常情况下两个字符被11个bit所标识
7.3.5 字节模式
在此模式下,每个字符都被编码为8比特。
在封闭系统国家或者手动制定的应用程序中,一个修改过的八位字符集可以被使用。比如ISO8859-1中的部分约定。 当字符集被默认修改时,解码的应用程序应该遵顼此约定。
M1.M2 格式不可以使用BYTE模式。
7.3.6 日本字模式
日本字被有效率的编码的规则是 符合jis x 0208的Shift jis system编码保持一致的。SHIFT JIS的数值是由 JIX0208 变化而来的。JIX 0208给给了详细的编码转换过程,每个2字节的字符会被转换为13比特的长度。
当制定了一个特殊的字符集,使得字节数值有可能是十六进制的81-十六进制的9F 并且/或者 E0-EB范围内。这样并不能明确的标识这是使用的日本字模式。 读取系统并不能确定这是否是一个双子节字符的开始位置。 所以应该在数据序列中遇到一段符合 ranji压缩规则的字符串时再对其进行操作(换句话说,开始字符在81-9f 或者/并且 尾部字符是 40-FC 7F除外,或者是EB后面跟着40-BF) H1-1 特征 用图像的形式展示了这种字节组合。
M1 M2格式不能使用日本字模式
7.3.7 混合模式
QR CODE 内的数据可能包含7.3.2-7.3.9章节之间的模式的各种组合。
MICOR QRCODE内的数据可能包含7.3.3-7.3.37之间各种模式的组合。
附录J 给出了QR CODE模式如何在混合模式下选择最有效率的标识方式的指引
附录J-3 给出了MICRO QR模式下可以使用两种模式混合的版本
7.3.8 结构添加模式
结构体添加模式用于将一个数据分割为一定数量的二维码符号,只有所有的符号都被解析了,包含数据的消息才能被正确的重建。结构数据头会被添加到所有符号中去,来标识整个数据的长度和当前符号在数据中位置,以及确定解析的符号属于同一条消息。详细的结构化添加模式信息可以查看第8章节。
结构化模式添加不适用于MICRO模式
7.3.9 FNC1 模式
FNC1模式是用来在数据中包含特殊格式的信息的。 在“1号位置”指明了数据格式是依照GS1 通用标准。“2号位置”指明了数据结构是遵循着AIM 公司制定的工作应用程序。FNC1模式作用于整个符号,而且他不会被后面的模式指示符号所影响。
注意 “1号位置”和“2号位置” 并不是指的真实的位置。当使用使用等式中使用时,他们的位置依赖于128符号的编码位置
FNC1 模式不是适用于MICRO QRCODE
7.4 数据编码
7.4.1 数据字句
输入数据流 是由一个或者几个指定编码模式形成碎片的比特流组成的。在默认的ECI模式下,比特流的编码规则是由第一个模式指示符号决定的。如果初始的ECI不是默认的ECI,比特流的编码方式是由跟在第一个碎片后面的ECI 头部信息决定的。
ECI应该具备以下字段(如果存在ECI):
--- 4比特长度的ECI模式指示符号
---- ECI 指示编码(8/16/24 比特)
ECI应该以指示符号开头(这是最重要的),并且以指示编码结尾。
比特流的剩余部分由下列元素组成:
----模式指示符
----字符数量指示
----具体的数据流
所有的模式片段都应该以 模式指示符开始(最重要的)并且以具体的数据流最后一个比特作为结尾(并不重要)。在模式片段之间不应该存在分割符号,因为他们的数据长度已经被规则严格限制了。
如果根据输入的数据按照指定的模式编码的步骤,在7.4.2-7.4.7章节中定义。 表2定义了每种模式的指示符号。表3以了指示符号的长度,该符号的长度会随着符号的版本而改变。
表2中定义了数据的结束符号,是3-9个0组成的。他的意思是为了填充版本剩余的数据容量和结束符号之间的空间。模式的结束符号并不是这个样子。
7.4.2 扩展渠道解释模式
7.4.2.1 常规情况
这种模式用来编码数据时,使用某种数据结构来替换原有的比特数据(比如,替换字符集)在遵循AIM ECI标准的前提下。 这个标准约定了数据的预处理方案,这种方案的开始标识是0111
扩展渠道解释模式仅仅适用于那些解析器已经开启支持的情况。如果解析器没有开启支持,那么将不会被识别。
被写入ECI的数据应该是被编码系统所操作的一组字节数据
位于ECI内部的数据将会被以最有效率的字节方式编码,而忽略其本身所自带的意义。举个例子,30-39的十六进制数据将会被数字0-9所替代,即使他们本来代表的意义不是数字。为了确定字符串长度的指示符号,字节的数量(或者日本字模式下,字节对的数量)应该被使用。
7.4.2.2 ECI指示器
所有的扩展渠道解释器都由一个六位数长度的数字来标示,用于表示ECI指示符由几个字组成,1还是2,或者3.最多三个。他们的编码规则看表4,ECI的标识符被编码为字符串时,一般会展现为十六进制5C的样子,在ISO8859-1中时反斜杠,在JIS编码中展现为 ¥符号, 遵循着六位数字的分配符号。当十六进制的5C 作为真实数据中出现的时候。应该在ECI编码前将数据翻倍。
当一个单独的5C数据作为输入时,应该插入一个符合指示器规则的ECI标识符号,如果遇到两个连续的5C数据则应该插入两次5C的真实数据。
当解码的时候,二进制模式下的第一个 ECI指示关键字(跟在ECI标示关键字后面的字),决定了ECI标示的长度. 跟随在比特0前面的比特1的长度 决定了,当前ECI定位符号后面的字的长度。在比特序列0以后的比特是ECI定位符真正的二进制数据。比ECI定位符长度更短的ECI数据可能会被用其他的方式所编码,但是更好的版本是不要短于定位符长度、
举例:
从被希腊语编码的数据中恢复数据,使用ISO 8859-7(ECI 000009)编码,符号版本是1H
被编码的数据: \000009XXXXX(字符串数值 a1 a2 a3 a4 a5)
ECI 模式符号 0111
ECI定位符号 000009 00001001
模式标示 0100
字符串长度标示 5 00000101
实际字符数据 10100001 10100010 10100011 10100100 10100101
最终数据 0111 00001001 0100 00000101 10100001 10100010 10100011 10100100 10100101
14.3章节介绍了解码过程。
7.4.2.3 多ECI模式
AIMECI 制定的标准中约定了当一个ECI符号内部存在另外一个ECI字句的情况。举个例子来说,某种字符编码的数据序列中,可能出现了另外的压缩或者加密的情况(而此压缩和加密的规则并没有在初始化时约定)。或者一个字符编码集合中可能会出现另外一个字符编码的情况。当在一个ECI中出现其他ECI数据时,需要遵循7.4.2.2中的约定,并且要提交一个新的模式片段。
7.4.2.4 ECI和结构化添加
所有被调用的ECI模块都要遵循上面讲的规则,还有AIM定义的约定,直到编码数据结束,或者切换到另外一个ECI(0111为标识符)。如果ECI中的编码的数据中存在两个或者更多的结构化添加模式,需要强制给所有的ECI加上一个头部信息,头部信息由ECI模式标识符和ECI定位数组成。他们应该在结构添加数据头之后立刻跟上。字句中的ECI也以此递归。
7.4.3 数字模式
输入的字符串数据,会被分组成由三个数字组成的小组,并且每个小组的数据都会被切换成10比特的2进制模式。如果输入的数字,那么不会一定是三个数字组成。一位或者二位的数据会被转换为4比特或者7比特。二进制的数据会被串联起来,并且添加上模式标示和字符串长度标示作为前缀。数字模式的标识符由两种 一种是QRCODE标准的四个比特,或者是表2中第一的MICRO标准的符号。字符长度的标示符号数量,在表3中也有定义。输入的数据需要先被转换为二进制数据长度,并且将此数据长度添加到模式标示和数据子句之间。
例子1 对于1H级别的数据来说
输入数据为 01234567
转换为三个数字分组 012 345 67
按组进行二进制转换 012 转换为 0000001100 345转换为 0101011001 67转换为1000011
讲数字链接成数据子句 0000001100 0101011001 1000011
讲字符长度转换为2进制的标示(1H版本是10个比特长度) 8 -> 0000001000
模式标识符0001 和比特长度加到前面形成结果
0001 0000001000 0000001100 0101011001 1000011
例子2 对于MICRO格式来说 (M3-M格式)
1 输入数据 0123456789012345
2 三个数进行分组 012 345 678 901 234 5
3 各自转换为二进制 012 -> 00000011000 345-> 0101011001 678 ->1010100110 901->1110000101 234->0011101010 5->0101
将它们串联起来 0000001100 0101011001 1010100110 1110000101 0011101010 0101
4 将字符数量切换至二进制(M3-M 是5比特长度)
16 ->