二维码(QR code)原理解析

二维码(QR code)原理解析

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

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位)

    名称指示符
    ECI0111

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

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

    ECI任务号(字符集)码字数码字值
    000000 ~ 00012710xxxxxxx
    000000 ~ 016383210xxxxxx xxxxxxxx
    000000 ~ 9999993110xxxxx 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
FNC10101(第一位置)
FNC11001(第二位置)

2.3 字符计数指示符

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

版本数字模式字母数字模式8位字节模式中国汉字模式
v1~v910988
v10~v2612111610
v27~v4014131612

2.4 终止符

名称指示符
终止符0000

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

3 码字转换

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

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

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

4 纠错

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值