二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。这两天学习了一下二维码图片生成的相关细节,觉得这个玩意就是一个密码算法,
QR码的基本结构
位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
校正图形:规格确定,校正图形的数量和位置也就确定了;
格式信息:表示改二维码的纠错级别,分为L、M、Q、H;
版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。
二维码的信息结构
“码元结构”是指二维码中的码元数。从版本1(21码元×21码元)开始,在纵向和横向各自以4码元为单位递增,一直到版本40(177码元×177码元)。
QR码的各个版本结合数据量、字符类型和纠错级别,均设有相对应的最多输入字符数。也就是说,如果增加数据量,则需要使用更多的码元来组成QR码,QR码就会变得更大。
例如,需要输入的数据为100位的数字时,通过以下步骤来选定。
1.假设要输入的数据种类为“数字”
2.从“L”“M”“Q”“H”中选择纠错级别。(假设选择“M”)
3.查看下表,先从数字列找出数字为100以上且接近100的,其次找出纠错级别“M”,两者交叉的部分就是最佳版本。
通过下面的计算为每个字符类型,总比特数的计算方法。
QR码的纠错
QR码的编码过程
首先查看模式编码:
实例:
数字模式:
数据可以按照一种模式进行编码,以便进行更高效的解码,例如:对数据:01234567编码(版本1-H),
1)分组:012 345 67
2)转成二进制:
012→0000001100
345→0101011001
67 →1000011
3)转成序列:0000001100 0101011001 1000011
4)字符总数 转成二进制(可以查看表3 字符计数位数 数字模式为10位 所以是10位2进制数):8→0000001000
5)加入模式指示符(上图数字)0001:0001 0000001000 0000001100 0101011001 1000011
数字字母模式
两两分组 首字符所对应的数值*45 + 第二个字符 转换成11位2进制数
如果末尾为1个字符 则直接转换为6位二进制数
对于字节、中文、日文等只是分组的方式、模式等内容有所区别。基本方法是一致的。
编码终止符
如果编码后的字符长度不足当前版本和纠错级别所存储的容量,则在后续补”0000”,如果容量已满则无需添加终止符。此时得到的编码串为:
例如 数字模式的01234567
0001 0000001000 0000001100 0101011001 10000110000
编成8bit码字
将以上的编码再按8bit一组,形成码字:
00010000 00100000 00001100 01010110 01100001 10000
如果尾部数据不足8bit,则在尾部充0:
00010000 00100000 00001100 01010110 01100001 10000000
如果编码后的数据不足版本及纠错级别的最大容量,则在尾部补充 “11101100” 和 “00010001”,直到全部填满。所以 数字01234567,版本1-H(72位数据位数)的最后qr码为:
00010000 00100000 00001100 01010110 01100001 10000000 00101110 10000000 11101100
原理参考文档:
https://blog.csdn.net/u012611878/article/details/53167009
QR Code编码标准 :
https://www.docin.com/p-366731780.html