二维码
一直都对二维码有很强烈的兴趣,除了觉得方便快捷和安全以外,不知道为什么二维码为什么这么受欢迎;所以特地来学习一下二维码的相关知识。
http://coolshell.cn/articles/10590.html#jtss-tsina
http://suflow.iteye.com/blog/1100678
简单地概括一下就是:为了生成一个二维码,也就是称为Quick Response Code,简称为QR Code.
英文就是有很多缩写的东西要记住。
然后分了很多步骤教了一堆知识:
基础ing
一个这样的框
说到底还是一个图,然后就是各种表示位置、数据、版本的布局咯,想想也没其它的东西需要了。至于这样的一个QR Code当然有大小:一共有40个尺寸,最小的尺寸从21x21,以后每个尺寸只需要从前一个变长增加4就好了,balabala。。。学过数列都知道最大的是177x177的咯。
数据编码ing
说了一堆的二维码现在支持的编码,因为谁也不知道以后支持多少编码,嘻嘻。
- Numeric mode 数字编码,从0到9 (这个最简单,所以做事例就它了)
- Alphanumeric mode 字符编码。包括 0-9,大写的A到Z(没有小写),以及符号$ % * + – . / : 包括空格。
- Byte mode, 字节编码,可以是0-255的ISO-8859-1字符。
Kanji mode 这是日文编码,也是双字节编码。同样,也可以用于中文编码。日文和汉字的编码会减去一个值。
不就是中文编码么!!
(以下是说着玩的)
- Extended Channel Interpretation (ECI) mode 主要用于特殊的字符集。
- Structured Append mode 用于混合编码,也就是说,这个二维码中包含了多种编码格式。
- FNC1 mode 这种编码方式主要是给一些特殊的工业或行业用的。比如GS1条形码之类的。
为了能够区别这些编码,特意做了一张表来区别一下,同时也给出了不同的编码模式下的单个编码的2进制位数。
怎么样看着有什么感觉?晕不?不晕。好的后面还有,嘻嘻!
开始事例:
说清楚版本(version),和纠错级别(这是开玩笑的吧),来做出相应的操作。
然后就是说要把01234567这数字分组
-> 转成01串(二进制)
-> 串起来(搞烧烤呢!!!)
-> 把这些数的总个数8也用10个二进位的来表示往串起来的01串的前面串上
-> 可能是嫌弃花样不够,还要在前面加上后接字符数的01串的编码01串
-> 还不够好看,在串后面加上结束01串。(还真会吃。)
-> 可能觉得串这样不好,所以规定所有01必须是8的倍数。(不然美感不够,好吧!真会吃)
-> 然后,(还有然后) 害怕不够吃所以一定要把竹签给串满了,不够就往后面继续加11101100 00010001这两个串。(我服)
纠错码ing
- 给纠错定个级别 好zb
级别 | 错误修正容量 |
---|---|
L水平 | 7%的字码可被修正 |
M水平 | 15%的字码可被修正 |
Q水平 | 25%的字码可被修正 |
H水平 | 30%的字码可被修正 |
- 再给一张表关于怎么把那些串给加工成小串。
这小串是什么鬼?
为了让看上去高大上一些,还给出了表格:而这个表格是由Reed-Solomon error correction(里德-所罗门纠错算法)得出。
组 | 块 | 数据 | 对每个块的纠错码 |
---|---|---|---|
1 | 1 | 67 85 70 134 87 38 85 194 119 50 6 18 6 103 38 | 213 199 11 45 115 247 241 223 229 248 154 117 154 111 86 161 111 39 |
2 | 246 246 66 7 118 134 242 7 38 86 22 198 199 146 6 | 87 204 96 60 202 182 124 157 200 134 27 129 209 17 163 163 120 133 | |
2 | 1 | 182 230 247 119 50 7 118 134 87 38 82 6 134 151 50 7 | 148 116 177 212 76 133 75 242 238 76 195 230 189 10 108 240 192 141 |
2 | 70 247 118 86 194 6 151 50 16 236 17 236 17 236 17 236 | 235 159 5 173 24 147 59 33 106 40 255 172 82 2 131 32 178 236 |
最终编码ing
二维码的混乱技术还没有玩完,它还要把数据码和纠错码的各个codewords交替放在一起。如何交替呢,规则:对于数据码:把每个块的第一个codewords先拿出来按顺度排列好,然后再取第一块的第二个,如此类推。
。。。
不想再吐槽,结果就是这样的:这就是我们的最终一个长串的样子了。居然又全串起来了,这火星人的思维果然不是这么好理解的。
67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87, 118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87, 16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17, 7, 236, 213, 87, 148, 235, 199, 204, 116, 159, 11, 96, 177, 5, 45, 60, 212, 173, 115, 202, 76, 24, 247, 182, 133, 147, 241, 124, 75, 59, 223, 157, 242, 33, 229, 200, 238, 106, 248, 134, 76, 40, 154, 27, 195, 255, 117, 129, 230, 172, 154, 209, 189, 82, 111, 17, 10, 2, 86, 163, 108, 131, 161, 163, 240, 32, 111, 120, 192, 178, 39, 133, 141, 236
画二维码ing
- 告诉你:这两个死都不变的东西就是相当于烤叉和烤架的脚的
- 怎么放烤叉和烤架的脚表格:
!table - 根据上述表格中的Version8的一个例子(6,24,42)开始烤一个。
- 放铁丝网
!Timing Pattern - 固定铁丝网
- 说明一下铁丝网
!aa
- 5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask
- 10个纠错bits。主要通过BCH Code来计算
- 然后15个bits串要先与101010000010010开始烤了(做XOR操作)
!result
烧烤也分等级 - 开始准备放调料了,确定放那种调料(Version Information)了。
开始上刚刚折腾很久的串了。(数据和数据纠错码)
然后是填接我们的最终编码,最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。
- 最后的最后,给烤好的01串做最后的样子加工,好卖也好吃。大概也是加点酱油、孜然、蔬菜什么的,嘻嘻(其实是掩码图案:进行Masking操作)
操作就是和下面的图片中的东西做一下最后的烘烤(xor)。
最后的
终于把这个二维码给学懂了,不知道的时候好复杂,学完之后感觉也不是很难的样子。也许这就是:
世上无难事只怕有心人。
只要好好学也不是学不会,毕竟知识都是用来学习也应用的,只是不同的知识对我们来说接受的能力不一样,但是并不代表学不会,只是可能会多绕几个弯,多话点时间。不气馁,总是能学到想学的知识技能的,嘻嘻。