二维码知识介绍

一、二维码的分类

二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量。

从形成方式上,二维码可以分为两类,

1、堆叠式二维码:在一维条形码的基础上,将多个条形码堆积在一起进行编码,常见的编码标准有PDF417等

图1 PDF417码示例

2、矩阵式二维码:在一个矩阵空间中通过黑色和白色的方块进行信息的表示,黑色的方块表示1,白色的方块表示0,相应的组合表示了一系列的信息,常见的编码标准有QR 码,汉信码等

                  

图2 QR码示例                                  图3 汉信码示例

PDF417由美国研发,在美国地区使用广泛

汉信码由中国自主研发,目前已在政府相关领域得到初步的使用。

QR码由日本研发,目前很多的应用都是用QR码进行编码,译码

目前使用最广的是QR码,所以接下来的内容会对QR码进行讲解,下文中提到的二维码,指的就是QR码

QR码分为40个版本,版本1由21x21个方块组成,每个版本增加4个方块,版本40由177x177个方块组成。每增加一个版本,QR码可储存的信息数量也随之增多。

版本1的二维码最多可以储存25个字符或41个数字,而版本40的二维码最多可以储存4296个字符或7089个数字

二、二维码的结构

一个二维码可以分为两个部分,功能图形和编码区域

图4

功能图形起到定位的作用

位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。

定位图形       :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。

校正图形       :仅在版本2以上存在,由三个黑白相间的小正方形嵌套组成,便于确定中心,纠正扭曲。

数据区记录了具体的数据信息,纠错信息与版本信息。

数据和纠错码:记录了数据信息和相应的纠错码,纠错码的存在使得当二维码的数据出现允许范围内的错误时,也可以正确解码。

版本信息       :仅在版本7以上存在,记录具体的版本信息。

格式信息       :记录使用的掩码和纠错等级。

此外二维码的外围还留有一圈空白区,主要是为了便于识别而存在。

三、数据编码与实例

针对不同的数据,QR码设计了不同的数据编码编码方式,我们可以根据数据的种类选择合适的编码方式进行编码。

数字编码(Numeric)        :可编码0-9,10个数字,如果需要编码的数字的个数不是3的倍数,最后剩下的1或2位数会被转成4或7bits,其它的每3位数字会根据不同版本被编成 10,12,14bits

字符编码(Alphanumeric) :可编码0-9,大写的A-Z,以及9个其他的字符(space $ % * + – . / :);

8位字节模式(8-bit Byte)     :可编码JIS X 0201的8位Latin/Kana字符集

除此之外,QR还提供了其他的编码方式,每一个编码方式都有其独有的id进行标识,这些标识会记录在数据区的前端,使得解码器可以根据二维码使用的编码方式对数据进行解码

图5   一些编码方式及其标识

纠错码

二维码存在4个级别的纠错等级,每个纠错级别可修正的错误与标识见图6,纠错级别越高,可以修正的错误就越多,需要的纠错码的数量也变多,相应的可储存的数据就会减少,版本1的二维码在L级别下可储存25个字符,在H级别下只能储存10个字符。

图6

下面给一个01234567在版本1下用数字编码(Numeric),选择的纠错级别是M的示例

第一步,将定位图案放到二维码中

图7

第二步:进行数据编码

根据图8,版本1下,采用Numeric Mode编码时,每三个数字需要10个bits进行标示

图8

012 ->0000001100

345 ->0101011001

67 ->1000011

组合起来为

0000001100 0101011001 1000011

在数据的头尾加上一些标准要求的信息

数字个数 (8) = 0000001000

编码格式      =0001

终止符         =0000

组合起来为

0000001100 0101011001 1000011->

0001 0000001000 0000001100 0101011001 1000011 0000

按8bit一组重新排列,末尾不足的补零

0001 0000001000 0000001100 0101011001 1000011 0000->

00010000 00100000 00001100 01010110 01100001 10000000

不足最大bit的添加补齐码(11101100 00010001),版本1 M下需要128bits

00010000 00100000 00001100 01010110 01100001

10000000->

00010000 00100000 00001100 01010110 01100001

10000000 11101100 00010001 11101100 00010001

11101100 00010001 11101100 00010001 11101100

00010001

第三步:添加纠错码

纠错码根据数据利用RS算法来进行计算,篇幅所限,这里就不具体讲解了,最终的结果如下:

00010000 00100000 00001100 01010110 01100001

10000000 11101100 00010001 11101100 00010001

11101100 00010001 11101100 00010001 11101100

00010001->

00010000 00100000 00001100 01010110 01100001

10000000 11101100 00010001 11101100 00010001

11101100 00010001 11101100 00010001 11101100

00010001 10100101 00100100 11010100 11000001

11101101 00110110 11000111 10000111 00101100

01010101

第四步:将最终的数据编码按顺序放入二维码中

                               

图9                                                                       图10

从左下角开始,1为黑色,0为白色,按顺序依次填入二维码中

第五步:添加格式信息和进行掩码运算

得到的图像还需要对数据区进行掩码运算,掩码运算的目的是让图像中黑色和白色方块分布的更加均匀一些,便于解码

有以下几种掩码运算,相应的标识和变换方式见图11,二维码的左上角的坐标为(0,0)

图11

图12  坐标系和掩码运算的图案

这里我们选择标识为011的掩码

格式信息的组成为                       :纠错标识+掩码标识+BCH纠错码

所以前面的纠错标识+掩码标识为:00011

BCH纠错码计算为:

得到纠错码为                             :011 0101 1001

格式信息为                                :00011 1101011001

为了避免选择标识00的纠错类别和标识000的掩码运算,照成格式信息为全0的数字,所得的格式信息还要与101010000010010做异或运算

000111101011001

101010000010010   XOR

101101101001011

最终的格式信息为                      :101101101001011

将格式信息放入二维码中

图13

对加格式信息后的二维码 进行掩码运算

得到的最终二维码,储存的数据信息是01234567

图14

整个流程见图15


                                      图15


四、二维码的安全知识

虽然二维码本身承担的只是一些文本数据,但仍会导致一些安全问题

1、攻击者将一些恶意网站或者一些恶意代码制作成二维码,用户扫描后,会自动下载一些恶意软件,或跳转到一些虚假网站给使用者造成危害,

2、二维码内如果包含一些可执行的脚本,便可能导致xss攻击     如 http://www.wooyun.org/bugs/wooyun-2012-09145

3、如果将一些敏感信息不加密而直接储存在二维码中,便会存在信息泄露的可能,比如11年火车票上的二维码就存在泄露使用者的身份证号码的问题。

五、总结

虽然我们在使用二维码的时候只需要用手机一扫即可,但二维码的编码和解码却包含了很多的步骤和很多的知识,此外二维码本身仅仅是数据的承载体,我们在使用时要针对一些敏感信息进行加密处理,防范潜在的攻击方式

时间: 2024-10-28 10:58:57

二维码知识介绍的相关文章

Android二维码的生成算法原理简介

二维码的定义:二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的.在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等.1.堆叠式/行排式二维条码,如,Code 16K.Code 49.PDF417(如下图)等2.矩阵式二维码,最流行莫过于Q

讲解开源项目:用 Python 生成有“灵魂”的二维码

本文作者:HelloGitHub-LITTLECHIEH 这是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家推荐一个 Python 开源生成二维码的项目--qrcode 一.介绍 1.1 二维码 二维码又称二维条码,常见的二维码为 QR Code,QR 全称 Quick Response.是一个近几年来移动设备上超流行的一种编码方式,在现在的生活中二维码随处可见.我们可以用它支付.浏览网站等,为什么他会这么流行?下面说几个特点: 可存储的信息量大:可容纳多达 1850 个大写

个性二维码开源专题&lt;基础篇&gt;

二维码原理介绍: 二维码为什么是黑白相间的?黑色表示二进制的"1",白色表示二进制的"0" "我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中."黄海平说,"制作二维码输入的信息可以分成三类,文本信息,比如名片信息:字符信息,比如网址.电话号码:还有图片信息,甚至还可以包括简短的视频."数据信息是怎么被编入的呢?信息输入后,首先要选择一种信息编码的码制.现在常见的二维码都是以QR码作为编码的码制.

微信公众平台开发(121) 微信二维码海报

关键字:微信公众平台 二维码 海报作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/weixin-poster.html 本文介绍微信公众平台下二维码海报的开发过程. 一.微信二维码海报介绍 微信二维码海报是指在海报中嵌入和微信用户关联的参数二维码的海报,用户分享推广之后,新用户可以被统计为被推广人员数,从而达到增加粉丝的传播效果.其使用场景如下:   二.开发流程 在微信二维码海报生成中,需要用到以下信息 1. 自定义菜单中设置一个菜单项,点击后返回二维

Atitit java 二维码识别 图片识别

1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数据编码31.6. 错误修正容量L水平7%的字码可被修正M水平15%的字码可被修正Q水平25%的字码可被修正H水平30%的字码可被修正31.7. QR是怎么对数据码加上纠错码的?31.8. 画二维码图41.9. 简要的编码过程:数据分析:确定编码的字符类型,按相应的字符集转换成符号字符: 选择纠错等级,71.10. qr长度容量7 1.1.解码编

QRCode - 二维码识别与生成

来源:Yi'mouleng(@丶伊眸冷) 链接:http://t.cn/R40WxcM 前言 有关二维码的介绍,我这里不做过多说明, 可以直接去基维百科查看,附上链接QR code(https://en.wikipedia.org/wiki/QR_code). IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDKa和ZXingObjC,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析二维码的接口.经过测试,使用原生API扫描和处理的效率非常高,

ios-深度解析二维码的生成与使用

利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面) 一.二维码的介绍 1.什么是二维码? 二维条码/二维码是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的 总结: 用图形记录标记一些信息,方便通过图形识别来获取信息 2 应用场景 信息获取(名片.地图.WIFI密码.资料) 手机电商(用户扫码.手机直接购物下单) 手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付) 微信添加好友 二.二维码界

python3调用NowAPI接口实现二维码生成工具

本人python学习菜鸟一枚,随着对python的学习,感觉python越来越好玩了,上次用接口查询IP地址后,又看到有道词典查询.二维码生成等接口相关的方法,并对其做了简单的尝试,确实是挺好玩的.所以将整个过程记录下来.分享在此,供大家一起交流学习. 1.基本环境 系统:windows 7 开发环境:pycharm python3 相关的模块和库  urlib  urllib.parse 2.NowAPI简单的介绍 NowAPI是一家 数据服务公司,提供大量的数据接口,对于我们这种学习的菜鸟来

Android应用--QR的生成(二维码)

二维码的定义: 二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的. 在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等.1.堆叠式/行排式二维条码,如,Code 16K.Code 49.PDF417(如下图)等. 2.矩阵式二维码,最流行莫