二维码(QR code)原理解析

二维码(QR code)原理解析

基于 《GB/T 18284-2000 快速响应矩阵码》

文章目录

  • 二维码(QR code)原理解析
    • 1 模式
      • 1.1 ECI 模式
      • 1.2 数字模式
      • 1.3 字母数字模式
      • 1.4 8位字节模式
      • 1.5 中国汉字模式
      • 1.6 混合模式
      • 1.7 结构链接模式
      • 1.8 FNC1模式
    • 2 位流编码
      • 2.1 ECI表头(可选)
      • 2.2 模式指示符
      • 2.3 字符计数指示符
      • 2.4 终止符
    • 3 码字转换
    • 4 纠错

1 模式

1.1 ECI 模式

扩充解释协议允许输出的数据流有与缺省的字符集不同的解释。

QR码支持4大类解释:

  • 国际字符集
  • 用于诸如加密或压缩等一般目的的解释
  • 闭环系统中用户自定义的解释
  • 无缓冲模式中用于结构连接的控制信息

QR码缺省解释是 ECI 000020,表示 ASCII 字符集

1.2 数字模式

数字模式对十进制数字 0~9(ASCII值 3 0 H E X → 3 9 H E X 30_{HEX} \to 39_{HEX} 30HEX39HEX)编码,通常密度为每 10 位表示 3 个字符。

1.3 字母数字模式

对 45 个字符的字符集进行编码

  • 10 个数字

ASCII值 3 0 H E X → 3 9 H E X 30_{HEX}\to39_{HEX} 30HEX39HEX

  • 26 个字母

ASCII值 4 1 H E X → 5 A H E X 41_{HEX}\to 5A_{HEX} 41HEX5AHEX

  • 9 个符号

ASCII 值 2 0 H E X , 2 4 H E X , 2 5 H E X , 2 A H E X , 2 B H E X , 2 D H E X , 2 E H E X , 2 F H E X , 3 A H E X 20_{HEX}, 24_{HEX}, 25_{HEX}, 2A_{HEX}, 2B_{HEX}, 2D_{HEX}, 2E_{HEX}, 2F_{HEX}, 3A_{HEX} 20HEX,24HEX,25HEX,2AHEX,2BHEX,2DHEX,2EHEX,2FHEX,3AHEX

1.4 8位字节模式

表示 ASCII 字符集,字符值 0 0 H E X → F F H E X 00_{HEX}\to FF_{HEX} 00HEXFFHEX ,编码密度为每字符 8 位。

1.5 中国汉字模式

表示 GB2312 规定的双字节表示的中国汉字和非汉字字符,其字符值为 GB 2312 规定字符对应的内码值,见 GB 18030。每个双字节字符由 13 位二进制表示。

1.6 混合模式

以上多种模式所表示的混合数据序列,最高效表示方法见 xx

1.7 结构链接模式

把一个数据文件分开表示为多个 QR 码符号的序列,要求所有符号可以识读并且数据可以按正确的顺序重新建立。

1.8 FNC1模式

用于表示按 UCC/EAN 应用标识标准或国标 AIM 协会已经同意的具体行业标准格式化数据。

2 位流编码

ECI 标头 + 模式指示符 + (中国汉字子集指示符) + 字符计数指示符 + 数据位流

注:在中国汉字模式下,需要加入中国汉字子集指示符,其格式为4位,指示所用的汉字子集。目前只选用了 0001

2.1 ECI表头(可选)

ECI模式指示符 + ECI指示符

如果最初的 ECI 不是缺省的 ECI,其前面要有 ECI 标头,后面为一个或多个不同模式的段。

  • ECI 模式指示符(4位)

    名称 指示符
    ECI 0111

    ECI 指定符的作用的规则见 AIM ECI 规范。

  • ECI 指定符(8, 16, 24位)

    ECI任务号(字符集) 码字数 码字值
    000000 ~ 000127 1 0xxxxxxx
    000000 ~ 016383 2 10xxxxxx xxxxxxxx
    000000 ~ 999999 3 110xxxxx xxxxxxxx xxxxxxxx

    码字值中,第一个 “0” 前的 “1” 的个数即对应码字数,第一个 “0” 后面的各位,是 ECI 任务号的二进制表示。

    从表中可以看出,三种任务号分类有重叠部分,也即,低 ECI 任务号可以用多种编码方式,但通常最短方式为首选。

    任务号即代表字符集。举两个例说明

    • 默认为 ASCII 数据集,即 ECI 000020

      任务号: 000020 ,转换为二进制即为 10100

      码字数:可以选择1或2或3,首选为 1。结合任务号的二进制,即得 0xx10100

      码字值:其余位置 “x” 用 0 填充,即 00010100

    • 希腊字母字符集 ISO 8859-7,即 ECI 000009

      任务号:1001

      码字数:0xxx1001

      码字值:00001001

如果以缺省的 ECI 开始,不需考虑。

2.2 模式指示符

模式 指示符数字
数字 0001
字母数字 0010
8 位字节 0100
中文汉字 1101
结构链接 0011
FNC1 0101(第一位置)
FNC1 1001(第二位置)

2.3 字符计数指示符

字符计数指示符的位数如下表所示,其值由字节的数量决定(在中国汉字模式中为双字节)

版本 数字模式 字母数字模式 8位字节模式 中国汉字模式
v1~v9 10 9 8 8
v10~v26 12 11 16 10
v27~v40 14 13 16 12

2.4 终止符

名称 指示符
终止符 0000

整个符号的结束由4位终止符表示,当符号数据尾流后所余的容量不足4位时,终止符将被截断。

3 码字转换

所得的数据位流将被分为一个个码字,所有码字的长度都是 8 位,如果位流长度最后一个码字不足 8 位,则用二进制为 0 的填充位填充至 8 位。

然后按照表定义的版本和纠错等级交替填充码字 11101100 和 00010001,将数据位流扩展,以填满符号的数据容量。为了正好填满符号容量,有些版本也许不能正好被8位的码字填充,此时需要在信息的最后添加 3、4或7个剩余位,用 “0” 来填充,不代表任何数据含义。

在把所得结果的数据码字序列按规则进行处理,加入纠错码字。

4 纠错

你可能感兴趣的:(QR,算法)