【转】二维码生成原理

原文链接:QR码生成原理-QR Code(ISO 18004)编码方式

一、什么是QR码

QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下:

这个图如果被正确解码,应该看到我的名字和邮箱。

二、QR码的特点

  说到QR码的特点:

  一是高速读取(QR就是取自“Quick Response”的首字母),对读取速度的体验源自于我手机上的一个软件,象上面贴出的码图,通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求;

  二是高容量、高密度;理论上内容经过压缩处理后可以存7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;

  三是支持纠错处理;纠错处理相对复杂,目前我还没有深入了解,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是:

    level L : 最大 7% 的错误能够被纠正;

    level M : 最大 15% 的错误能够被纠正;

    level Q : 最大 25% 的错误能够被纠正;

    level H : 最大 30% 的错误能够被纠正;

  四是结构化;看似无规则的图形,其实对区域有严格的定义,下图就是一个模式2、版本1的QR图结构(关于QR码的"模式"、"版本"将在后面进行介绍):

  在上图21*21的矩阵中,黑白的区域在QR码规范中被指定为固定的位置,称为寻像图形(finder pattern) 和 定位图形(timing pattern)。寻像图形和定位图形用来帮助解码程序确定图形中具体符号的坐标。

  黄色的区域用来保存被编码的数据内容以及纠错信息码。

  蓝色的区域,用来标识纠错的级别(也就是Level L到Level H)和所谓的"Mask pattern",这个区域被称为“格式化信息”(format information)。

五是扩展能力。QR码的Structure Append特点,使一个QR码可以分解成多个QR码,反之,也可以将多个QR码的数据组合到一个QR码中来:

三、QR码的模式和版本

  前面提到过QR码的模式(Model)和版本(Version)。QR码分为Model1和Model2两种模式,Model1是对QR的初始定义,Model2是对Model1的扩展,目前使用较为普遍的是Model2,本文的所有说明也仅用于Model2。

  QR图的大小(size)被定义为版本(Version),版本号从1到40。版本1就是一个21*21的矩阵,每增加一个版本号,矩阵的大小就增 加4个模块(Module),因此,版本40就是一个177*177的矩阵。(版本越高,意味着存储的内容越多,纠错能力也越强)。

四、QR码支持的编码内容

  QR码支持编码的内容包括纯数字、数字和字符混合编码、8位字节码和包含汉字在内的多字节字符。其中:

    数字:每三个为一组压缩成10bit。

    字母数字混合:每两个为一组,压缩成11bit。

    8bit字节数据:无压缩直接保存。

    多字节字符:每一个字符被压缩成13bit。

五、QR码编码原理(编码)

编码就是把常见的数字、字符等转换成QR码的方法。说具体的编码之前,先说一下QR码的最大容量问题。

5.1 最大容量

QR码的最大容量取决于选择的版本、纠错级别和编码模式(Mode:数字、字符、多字节字符等)。以版本1、纠错级别为Level Q的QR码为例,可以存储27个纯数字,或17个字母数字混合字符或11个8bit字节数据。如果要存储同样多的内容同时提高纠错级别,则需要采用更高的 版本。版本1~9 数据容量、纠错码容量对照如下表:


(version)


(error correcting level)


(count of data code words)


count of EC code words


(numeric)


(alphanumeric)


8bit


1


L


19


7


41


25


17


M


16


10


34


20


14


Q


13


13


27


16


11


H


9


17


17


10


7


2


L


34


10


77


47


32


M


28


16


63


38


26


Q


22


22


48


29


20


H


16


28


34


20


14


3


L


55


15


127


77


53


M


44


26


101


61


42


Q


34


36


77


47


32


H


26


44


58


35


24


4


L


80


20


187


114


78


M


64


36


149


90


62


Q


48


52


111


67


46


H


36


64


82


50


34


5


L


108


26


255


154


106


M


86


48


202


122


84


Q


62


72


144


87


60


H


46


88


106


64


44


6


L


136


36


322


195


134


M


108


64


255


154


106


Q


76


96


175


108


74


H


60


112


139


84


58


7


L


156


40


370


224


154


M


124


72


293


178


122


Q


88


108


207


125


86


H


66


130


154


93


64


8


L


194


48


461


279


192


M


154


88


365


221


152


Q


110


132


259


157


108


H


86


156


202


122


84


9


L


232


60


552


335


230


M


182


110


432


262


180


Q


132


160


312


189


130


H


100


192


235


143


98

如果要了解更详细的QR码容量信息,可以到电装的网站去看看:

http://www.denso-wave.com/qrcode/vertable1-e.html

下面,就举例说明将“ABCDE123”转换成为版本1、Level H的QR码转换方法。

5.2 模式标识符(Mode Indicator)

QR码的模式(Mode)就是前文提到的数字、字符、8bit 字节码、多字节码等。对于不同的模式,都有对应的模式标识符(Mode Indicator)来帮助解码程序进行匹配,模式标识符是4bit的二进制数:

1、数字模式(numeric mode ): 0001

2、混合字符模式(alphanumeric mode) : 0010

3、8bit byte mode: 0100

4、日本汉字(KANJI mode) : 1000

5、中国汉字(GB2312):1101

由于示例文本串是混合字符,因此将选择alphanumeric mode,其标识码为:0010

5.3 文本串计数标识符(Character count indicator)

文本串计数标识符用来存储源内容字符串的长度,在版本1-9的QR码中,文本串长度标识符自身的长度被定义为:

数字 : 10bit

混合字符 : 9bit

8bit 字节码 : 8bit

多字节码 : 8bit

在本例中,源文本串的长度为8个字符,混合字符的长度为9bit,因此将字符个数8编码为9位二进制表示:000001000

加上混合字符模式标识码,总的编码为0010 000001000

5.4 数据内容编码

1、数字模式下的编码

在数字模式下,数据被限制为3个数字一段,分成若干段。如:"123456" 将分成"123" 和 "456",分别被编码成10bit的二进制数。“123”的10bit二进制表示法为:0001111011,实际上就是二进制的123。

当数据的长度不足3个数字时,如果只有1个数字则用4bit,如果有2个数字就用7个bit来表示。
如:"9876"被分成"987"和"6"两段,因此被表示为"1111011011 0110"。

2、混合字符模式下的编码

混合字符模式编码,其字符对照表如下:


0


0


A


10


K


20


U


30


+


40


1


1


B


11


L


21


V


31


-


41


2


2


C


12


M


22


W


32


.


42


3


3


D


13


N


23


X


33


/


43


4


4


E


14


O


24


Y


34


:


44


5


5


F


15


P


25


Z


35


6


6


G


16


Q


26


[sp]


36


7


7


H


17


R


27


$


37


8


8


I


18


S


28


%


38


9


9


J


19


T


29


*


3

编码方式为:

源码被分成两个字符一段,如下所示,每段的第一个字符乘上45,再用第二个数字相加。因此每段变成了11bit的2进制码,如果字符个数只有1个,则用6bit表示。

示例:


"AB"


"CD"


"E1"


"23"


45*10+11


45*12+13


45*14+1


45*2+3


461


553


631


93


0010


000001000


00111001101


01000101001


01001110111


00001011101

3、8bit字节数据不经编码转换直接保存。

5.5 编码终止符(Terminator)

如果编码后的字符长度不足当前版本和纠错级别所存储的容量,则在后续补"0000",如果容量已满则无需添加终止符。此时得到的编码串为:

0010 000001000 00111001101 01000101001 01001110111 00001011101 0000

5.6 编成8bit码字(Code words)

将以上的编码再按8bit一组,形成码字(code words):

00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000

如果尾部数据不足8bit,则在尾部充0:

00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000

如果编码后的数据不足版本及纠错级别的最大容量,则在尾部补充 "11101100" 和"00010001",直到全部填满。最后,版本1、Level H下的"ABCDE123" 的QR码是:

00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000 11101100

十进制表示法为:

32 65 205 69 41 220 46 128 236

QR码编码原理(日本汉字和中文编码)

一、日本汉字(KANJI)是两个字节表示的字符码,编码的方式是将其转换为13字节的二进制码制。

转换步骤为:

1、对于JIS值为8140(hex) 到9FFC(hex)之间字符:

a)将待转换的JIS值减去8140(hex);

b)将高位字节乘以C0(hex);

c)将b)步骤生成的数据加上低位字节;

d)将结果转换为13位二进制串。

2、对于JIS值为E040(hex)到EBBF(hex)之间的字符:

a)将待转换的JIS值减去C140(hex);

b)将高位字节乘以C0(hex);

c)将b)步骤生成的数据加上低位字节;

d)将结果转换为13位二进制串。

二、中文汉字的与日文汉字转换步骤相似:

1、对于第一字节为0xA1~0xAA之间,第二字节在0xA1~0xFE之间字符:

a)第一字节减去0xA1;

b)上一步结果乘以0x60;

c)第二字节减去0xA1;

d)将b)步骤的结果加上c步骤的结果;

e)将结果转换为13位二进制串。

1、对于第一字节为0xB0~0xFA之间,第二字节在0xA1~0xFE之间字符:

a)第一字节减去0xA6;

b)上一步结果乘以0x60;

c)第二字节减去0xA1;

d)将b)步骤的结果加上c步骤的结果;

e)将结果转换为13位二进制串。

原文地址:https://www.cnblogs.com/xdouby/p/9007360.html

时间: 2024-11-05 12:12:52

【转】二维码生成原理的相关文章

二维码生成原理

二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型 AD:WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等.这两天学习了一下二维码图片生成的相

关于《手机扫描电脑二维码登录原理》的学习

技术学习:手机扫描电脑二维码登录原理 通用地实现方式(以登录电脑浏览器网页版微信为例): 1.每打开一次微信(Client)电脑浏览器网页时会随机生成一个含有唯一uid的二维码,每次刷新页面都会不一样(*这个可以保证一个uid只可以绑定一个帐号和密码,如果一个uid可以绑定多个帐号和密码,那么很可能你的电脑会登录别人的微信) ps: 返回uid的目的是识别用户身份,而且实际上打开这个页面时浏览器已经和Server创建了一个长连接等待确认信息.这个页面在加载完毕时,也已经把很多登录后才需要的相关资

微信QQ的二维码登录原理浅析

在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用开始多起来,这里先说下啥是二维码,其实二维码就是存了二进制数据的黑白图片,当出现要求二维码登录的时候,服务器会生成一条临时的唯一的二维码信息,发送到客户端以二维码(图片)的形式写入到网页,然后你就会看到统一的四个方形的二维码,如果做的好这个二维码信息应该是有时效的,这里暂且不考虑这些,就简单的微信登录作为例子看看吧: 首先说下整个授权流程: 在客户端网页中会不断向服

[开源]C#二维码生成解析工具,可添加自定义Logo

二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,中文等等.今天就来跟大家分享一下我的二维码生成解析工具,主要功能就是生成二维码,并且可以添加自定义的Logo.当然,网络上面生成二维码的工具多如牛毛,生成二维码早已不再新鲜.这个工具的一个亮点就是可以识别二维码,下面就来具体看看吧,不过首先要补充一点二维码的知识.  一.二维码基础知识 一

杂项收集,包括-发邮件、二维码生成、文件下载、压缩、导出excel

本篇就最近工作解决的问题做个代码收集.包括以下几个方面:发邮件.二维码生成.文件下载.压缩.导出excel.有一种可用的解决方法就好,不求全面,不求原理. 1.发邮件: 命名空间:System.Net.Mail程序集:System(在 system.dll 中) tips: MailMessage 类的实例用于构造可使用 SmtpClient 类传输到 SMTP 服务器以便传递的电子邮件. 若要指定电子邮件的发件人.收件人和内容,请使用 MailMessage 类的关联属性.一般需要注意的有 发

C#实现二维码生成与解码

前几天公司内部分享了一个关于二维码的例子,觉得挺好玩的,但没有提供完整的源码.有时候看到一个好玩的东西,总想自己Demo一个,于是抽空就自己研究了一下. 一.二维码的原理 工欲善其事,必先利其器.要生成二维码,首先得了解一下,什么是二维码.关于二维码,百度百科是这么说的:二维条码(二维码)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.二维码是DOI(Digital Object Unique Identifier,数字对象唯一识别符)的一种.二维码的优

Android 开发中使用到二维码生成和解析

二维码生成 二维码解析 在项目的开发中, 使用二维码作为数据传递 交换 已经是常态了! 在这我也讲讲自己在项目开发中使用到的二维码. 生成二维码的开发流程 1 应用google 给我们提供的zxing.jar (建议官网下载) 2 使用zxing.jar 的MultiFormatWriter 类 生成一张二维码图片 核心代码块 /** * 方法说明:生成无图片二维码 */ @SuppressWarnings("unused") private Bitmap createTwoCode(

HP QR Code (php二维码生成类库)

HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.sourceforge.net/ 下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2. phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本:参数$outfile表示是否输出二维码图片 文件,默认否:参数$level表示容错率,也就是

利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验

前期准备 引入phpqrcode类库(下载地址:https://sourceforge.net/projects/phpqrcode/) PHP开启GD扩展库支持 1.利用phpqrcode生成二维码: 原理分析: 下载下来的类文件是一个压缩包,包含很多文件和演示程序,我们只需要里边的phpqrcode.php 这一个文件就可以生成二维码了,它是一个多个类的集合文件,我们需要用到里边的QRcode类的png()方法: public static function png($text, $outf