java⼆维码原理以及⽤java实现的⼆维码的⽣成、解码
⼀、什么是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码的最⼤容量取决于选择的版本、纠错级别和编码模式(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
1L197412517 M1610342014 Q1313271611 H91717107
2L3410774732 M2816633826 Q2222482920 H1628342014
3L55151277753 M44261016142 Q3436774732 H2644583524
4L802018711478 M64361499062 Q48521116746 H3664825034
5L10826255154106 M864820212284 Q62721448760 H46881066444
6L13636322195134 M10864255154106 Q769617510874 H601121398458 L15640370224154
7
M12472293178122 Q8810820712586 H661301549364
8L19448461279192 M15488365221152 Q110132259157108 H8615620212284
9L23260552335230 M182110432262180 Q132160312189130 H10019223514398
下⾯,就举例说明将“ABCDE123”转换成为版本1、Level H的QR码转换⽅法。
⼆、模式标识符(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
三、⽂本串计数标识符(Character count indicator)
⽂本串计数标识符⽤来存储源内容字符串的长度,在版本1-9的QR码中,⽂本串长度标识符⾃⾝的长度被定义为:
数字 : 10bit
混合字符 : 9bit
8bit 字节码 : 8bit
多字节码 : 8bit
在本例中,源⽂本串的长度为8个字符,混合字符的长度为9bit,因此将字符个数8编码为9位⼆进制表⽰:000001000
加上混合字符模式标识码,总的编码为0010 000001000
四、数据内容编码
1、数字模式下的编码
在数字模式下,数据被限制为3个数字⼀段,分成若⼲段。如:"123456"将分成"123"和 "456",分别被编码成10bit的⼆进制
数。“123”的10bit⼆进制表⽰法为:0001111011,实际上就是⼆进制的123。
当数据的长度不⾜3个数字时,如果只有1个数字则⽤4bit,如果有2个数字就⽤7个bit来表⽰。
如:"9876"被分成"987"和"6"两段,因此被表⽰为"1111011011 0110"。
2、混合字符模式下的编码
混合字符模式编码,其字符对照表如下:
00A10K20U30+40
11B11L21V31-41
22C12M22W32.42
33D13N23X33/43
44E14O24Y34:44
如何制作二维码55F15P25Z35
66G16Q26[sp]36
77H17R27$37
88I18S28%38
99J19T29*3
编码⽅式为:
源码被分成两个字符⼀段,如下所⽰,每段的第⼀个字符乘上45,再⽤第⼆个数字相加。因此每段变成了11bit的2进制码,如果字符个数只有1个,则⽤6bit表⽰。
⽰例:
"AB""CD""E1""23"
45*10+1145*12+1345*14+145*2+3
46155363193 001000000100000111001101010001010010100111011100001011101
3、8bit字节数据不经编码转换直接保存。
五、编码终⽌符(Terminator)
如果编码后的字符长度不⾜当前版本和纠错级别所存储的容量,则在后续补"0000",如果容量已满则⽆需添加终⽌符。此时得到的编码串为:
0010 000001000 00111001101 010******** 010******** 000010111010000
六、编成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 1000000011101100⼗进制表⽰法为:
32 65 205 69 41 220 46 128 236
⼀、⽇本汉字(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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论