- [译]ISO/IEC 18004-2015 二维码标准文档(3)
- [译]ISO/IEC 18004-2015 二维码标准文档(1)
- [译]ISO/IEC 18004-2015 二维码标准文档(2)
- [译]ISO/IEC 18004-2015 二维码标准文档(8)
- [译]ISO/IEC 18004-2015 二维码标准文档(5)
- [译]ISO/IEC 18004-2015 二维码标准文档(7)
- [译]ISO/IEC 18004-2015 二维码标准文档(6)
- [译]ISO/IEC 18004-2015 二维码标准文档(4)
- 国际标准是如何制定的-规则篇
- Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)
书接上回,7.4.4

举个例子(1H级别的符号)
输入数据 AC-42
1 根据表5来确定字符的具体数值 AC-42 -> 10,12,41,4,2
2 对字符数值两两分组 (10,12)(41,4)(2)
3 按照编码规则,转换为11位的比特
10,12 10*45+12 -> 00111001110
41.4 41*45+4 -> 11100111001
2 -> 000010
4 链接成数据子句
00111001110 11100111001 000010
5 字符数量转换为二进制
5 → 000000101
6 添加模式标示0010 至模式头部
0010 000000101 00111001110 11100111001 000010
字母数字类别的字符,比特长度转换依赖与下面的公式

B = M +C + 11(D DIV2) + 6(D MOD2)
其中 B 是 比特流的长度 M 模式标识符的数值 (QR 标准下是2个比特,MICRO 标准请看表2) C 字符数量的标示数值,具体看表3 D 输入字符的真实数据

7.4.5 字节模式
在这种模式下,一个8比特长度的 字直接代表一个 字节的数值, 包括8比特密度的字符


备注1 在JIS8字符编码中,具体看表H1, 80-9F以及 E0到FF的字段没有分配。但是却被接受了, 他们其中的一些,是作为SHIFT JIS编码中的第一个字节了(可以参考表H2),并且可能会被用于区分是 JIS8还是SHIFT JIS编码,或者是因为启用KANJI的压缩模式生成的。JIS X 0208 给出了换挡后的编码的具体含义
备注2 JIS8 编码中的00 - 7F的数据与 ISO 8859-1以及 ISO 646 IRV格式保持一直,除了 5C到7E之间的数值

二进制的数据稍后会被模式标示和字符数量标示所前缀,字节模式在标示在QRCODE中是四个比特,在MICRO模式中的约定参看表2。 字符数量的标示,在表三中被定义。字符数量的长度会被编码为二进制后,加到模式标示和二进制数据子句之间。

对于所以字符类型的数据字节流长度,可以通过下面的额公式计算
B = M + C + 8D
其中 B是比特流的长度,M是模式标示的数值,QRCODE标准中其为4个比特,MICRO的约定参看表2, C 是字符数量的比特标示,参见表3 D是输入的字符数据长度

7.4.6 日本字模式
在SHIFT JIS系统中,日本字由两个字节的组合标示,他们的数值从JIS X 0208中变换而来。JIS X 0208 给出了所有编码包含的意义,被以日本字模式输入的字符数据会按照下面的规则,会编码为一个13字节长度的二进制字。 之后数据流会被加上模式标示和数据长度的前缀。 该模式的指示符号,在QRCODE标准中是一个数字像是的4比特单位,在MICRO中的形式看表2,字符长度的标示看表3. 数据长度的数量会被编码为2进制,然后添加到数据流和模式标示中间。

1 对于SHIFT JIS中 8140-9FFC的字符来说
a) 需要减去 8140
b) 使用C0乘以结果的最大有效字节
c) 最小有效字节加以 B步骤的结果
d) 将其转换为一个13字节长度的比特序列
2 对于E040到 EBBF中的数值来说
a) 减去 C140
b) C0乘以最大有效字节
c) B步骤的结果加以最小有效字节
d) 转换为13比特序列

举个例子
输入字符串 点 和 茗
SHIFT JIS的对应数值 935F E4AA
1 减去8140 或者 C140 121F 236A
2 使用CO乘以最大有效字节 D80 1A40
3 加上最小有效字节 D9F 1AAA
4 进行转换为13比特的长度 0D9F -> 0 1101 1001 1111 1AAA-> 1 1010 1010 1010

3 对于所有的字符来说
e) 在数据比特前面加上模式标示(看表2)以及字符转换后的二进制长度(表中定义的比特数量)
日本字模式的数据比特长度计算公式如下
B = M +C + 13D
其中 B是比特流的长度 M 是模式指示符(QRCODE是四个比特,MICRO表中看表2)
C 字符长度标示(看表三) D 输入的数据字符数据

混合模式的意思提供一个选项,是一个符号里面包含多个数据序列,如果需要的话,可以一个接一个的切换模式并且解析。或者是处于增加编码密度的考虑。 指引文档可以参见Annex J文档,所有的片段都需要选择74.2-7.4.6之间合适的编码模式。他们的每个片段,都是字符数量标示紧跟在模式标示后面的基本结构。说明13 解释了这种包含数据的片段。

7.4.8 FNC1 模式
7.4.8.1 概述
在QRCode符号种,有一种符号,他们的有两个模式符号连续使用的。 他们的符号模式,是来自与7.3.2 - 7.3.9以及7.4.2-7.4.7之间的定义的模式。 他们的信息编码方式与工业和应用所指定。 这两个模式符号中间的数据是由不相干的参数数据有效率的编码构成,当这种模式被使用的时候编码器需要先按照14.2或者ANNEX E文档中的约定传输符号的标识符。
7.4.8.2 一号位置
注意,这里的“一号位置”并不是位于一个连同的句子中的,他是一个在func1的128字符一个历史引用。
这个模式的指示标识符号会根据gs1应用标准,进行格式化的编码数据。在这种期望下,一个符号中应该只出现一次这种符号,并且他们应该在当第一个模式只是符号前出现(例如数字,字节等模式)。并且应该在ECI和结构勾画添加头之后。当GS1标准符号出现了fnc1的符号,作为数据字段的表示符号,QRCODE 应该用字符模式下的%或者GS(字节数值是1D)来表达这个符号。如果在数据中也出现了%,那么它会被编码为%%, 编码器在遇到%的时候,应该将其传输为ASCII/JIS8的数值1D,如果遇到%% 应该将其传输为一个单独的%

举个例子:
输入数据: 0104912345123459( 应用标识01 代表了GS1 文章符号,长度固定,数据段是04912345123459)
15970331 (15的意思是 最佳截至日期,固定长度,后面的数据代表97年三月31日)
30128(30代表了质量,可变长度,数值128)(需要分隔符号)
10ABC123(10 代表了一批数字,可变长度,数值ABC123)
整体数据会被编码:01049123451234591597033130128%10ABC123
符号标记的bit:
0101(FNC1的模式标识符,标记了第一个位置)
0001(模式标识符,意思是数字)
0000011101(字符长度标识符,29,意思是上面比特总长度)
0010(数字英文模式,标识符)

000001001(字符长度标识9, 上面的那段%ABC123)
传输后的数据(详见14.2 AnnexF)

例子2 编码和传输过程中%的体现
输入数据 123% 编码后 123%% 传输数据 123%

7.4.8.3 FNC1的第二个位置
注意 “第二个位置”的意思并不是在一个连同的句子中的,他们是一个历史的相对引用位置。 在FNC1模式下128个符号中的一个。
这个模式的标识指示符,是根据由基于AIM国际标准的特定工业和应用标准的编码格式。他会立即跟在一个1字节字后面,这个字节是由符合AIM标准的应用程序制定的。 在此场景下,标识符号应该只出现一次,并且应该在被模式符号之前(数字,英文,字节,双字节字),并且跟在ECI 或者结构化添加头之后。 标识符可能是由[A-Z,a-z]中的任意单个拉丁字符组成(他们会被ASCII的数值 正100所标识)。或者两位数字,

两位数字直接就代表了,他们自己的数值,此时编码器应该将这些字符编码放在数据之前。当应用程序需要FNC1字符(这是一个约定好的特殊字符)作为一个数字段符号时应该加上字符格式的%作为前缀,编码格式为ASCII或者jis8的GS 在字节模式下, 如果原本有%,则展示为%%.

7.4.9 结束符号
符号的数据部分结束时,应该加上0bit序列作为标识。这些事情在表2中有定义。 这些比特序列会跟在最终模式片段之后。 终止符号在处理数据时应该被忽略,如果数据刚刚好填充满符号。或者如果剩余空间不足比特长度终止符长度的时候,应该缩写。

7.4.10 比特流编码为字
当比特流转换为各个模式的片段时,必须按照一定的顺序进行。终止符号需要被添加到比特流后面,就如7.4.9所描述的那样。 然后得到的结果需要被拆分编码为字。所有的字都应该时8个比特长度,除了micro QR中的M1-M3.他们是四个比特长度。 如果比特不能被8整除,那说明他们还不到一个字的边界,应该填充0比特知道边界。 比特的长度应该符合表8中对version和纠错码的约定,不足的地方交替填充字 11101100和00010001。 对于MICRO QR M1-M3来说,最终的字是四个比特长度。他们填充的比特字是0000. 最终得到的比特流会按照7.5的约定添加纠错码信息,按照某一确定的版本。 再之后,可能会添加 3,4,7 剩余比特(全是0)加到纠错信息的后面。最后得到可以完全填充容量的比特信息。







备注1 所有的字都是8比特,除了M1-M3版本的最后一个数据字是4比特。
备注2 这里的data bit 数量 包含了模式指示符号和字符长度标识

7.5 纠错信息
7.5.1 纠错信息容量
QR CODE使用了里德所罗门算法来识别和纠正错误信息。会有一系列纠错码数据字被生成出来,添加到数据的后面用来让符号在数据丢失或损坏得情况下,依然可以使用。 表8中定义了四种可以选择得纠错码级别,他们可以让恢复指定数量得容量。
AnnerK.2给出了如何选择一个适用得纠错码级别,应用于图像。
Micro QR不支持H级别
纠错字可以纠正两种类型得情况,第一种时失去得字数据(明确位置信息,但是信息字节错误)第二种时错误信息(未知位置信息,错误得信息字) 遗失得意思时,无法扫描或者无法解码,错误得意思时解析失败的符号字符。因为二维码时一种矩阵技术,所以如果某个模块 黑色被当成了白色,或者白色被当成了黑色,都可以被识别为一个错误标识得内容。这样得一个错误,需要两个纠错码才能纠正它。

可以被就错了得遗失或者错误 的模点遵循下面的公式:
e + 2t <= d- p
e 是遗失的模点数量 t 是错误的模点数量 d 是纠错码数量 p 是被错误解析的保护字节(译者注:错误而非遗失)
一般情况下,p 是0,但是如果大部分的纠错码容量就去用于处理遗忘模点,然后可能会导致没有发现的错误增加。不论何时,当遗失模点的数量超过纠错码一般的时候,p =3。 对于小于8个纠错码字的小符号来说,遗忘纠错不应被使用(e = 0 并且 p > 0)
举个例子 在版本6H符号来说,数据容量尺寸是172,112是纠错码字,剩下60个纯粹的数据字。112个数据纠错码,可以纠正56个错误字.(解析错误,或者移位错误) 换句话说 56/172 也就是32.6%的符号容量
套用上面讲过的公式,那么下列数值将会用于定义p

p =3 在1-L 或者M2-L 上
p= 2 在1-M,2-L,M1,M2-M,M3-L,M4-L
p = 1 1-Q,1-H,3-L
p =0 其他情况
当 p > 0的时候,换句话说(1,2,3)。 此时p字节扮演了错误码搜集的功能,并且用于组织当错误的数量超过限制之后,继续传输数据的作用。e 必须小于 1/2的d,举个例子再2L 版本中,一共有44个字长,其中34个是是数据字,还有十个是纠错码。从表9中可以看到它的错误容量是4(e = 0),套用上面的公式:
0 + 2 * 4 = 10 - 2;
它的意思是纠正四个错误,只需要8个错误矫正符号。剩下的两个可以用来检测(仅仅是检测,而不是修正)额外的错误。如果超过四个错误,那么解析失败。
根据不同的版本和纠错码级别,数据比特需要被拆分不同的模块中,用以分割各自的纠错算法。在表9中有定义所有的版本,纠错码的整体字数,纠错码字数,以及纠错码块的数量和结构。
如果需要填充剩余位置,请使用Bit0填充。













table9太长了。换篇文章再聊。
网友评论