天天掃二維碼是怎么生成的呢?解析原理
二維碼結(jié)構(gòu)
1.版本信息:version1(21*21),version2,...,version40,一共40個(gè)版本。版本代表每行有多少模塊,每一個(gè)版本比前一個(gè)版本增加4個(gè)碼元,計(jì)算公式為(n-1)*4+21,每個(gè)碼元存儲(chǔ)一個(gè)二進(jìn)制0或者 1。1代表黑色,0表示白色。比如,version1表示每一行有21個(gè)碼元。
2:格式信息:存儲(chǔ)容錯(cuò)級(jí)別L(7%),M(15%),Q(25%),R(35%)。容錯(cuò):允許存儲(chǔ)的二維碼信息出現(xiàn)重復(fù)部分,級(jí)別越高,重復(fù)信息所占比例越高。目的:即使二維碼被圖標(biāo)遮住一部分,一樣可以獲取全部二維碼內(nèi)容。有圖片的二維碼, 圖片不算二維碼的一部分,它遮住一部分碼元,但還是可以掃描到所有內(nèi)容。
3.數(shù)據(jù)和糾錯(cuò)碼字:實(shí)際保存的二維碼信息,和糾錯(cuò)碼字(用于修正二維碼損壞帶來的錯(cuò)誤,就是說當(dāng)碼元被圖片遮住,可以通過糾錯(cuò)碼字來找回)。
4.位置探測圖形、位置探測圖形分隔符、定位圖形,校正圖形:用于對(duì)二維碼的定位。位置探測圖形用于標(biāo)記矩形大小,3個(gè)圖形確定一個(gè)矩形。定位符是因?yàn)槎S碼有40個(gè)版本尺寸,當(dāng)尺寸過大后需要有根標(biāo)準(zhǔn)線,不然掃描的時(shí)候可能會(huì)掃歪。
二維碼的生成
信息按照一定的編碼規(guī)則后變成二進(jìn)制,通過黑白色形成矩形。1、根據(jù)version和糾錯(cuò)級(jí)別(糾錯(cuò)碼的數(shù)量)編碼生成一個(gè)二進(jìn)制序列,序列包含
編碼類型的二進(jìn)制(數(shù)字類型,字符類型有特定的編碼) 編碼內(nèi)容的長度的二進(jìn)制 編碼內(nèi)容的二進(jìn)制 結(jié)束符(4個(gè)0)
2、將序列按8bits為一組重排,如果所有的編碼加起來不是8個(gè)倍數(shù),還要在后面加上足夠的0。
3、補(bǔ)碼。如果序列還沒有達(dá)到最大的bits數(shù)的限制,還要加一些補(bǔ)齊碼(Padding Bytes),Padding Bytes就是重復(fù)下面的兩個(gè)bytes:11101100 00010001。每種版本的bits的位數(shù)是不同的。
4、生成糾錯(cuò)碼?梢圆榭次臋n的第30頁到44頁的Table-13到Table-22的定義表,可以知道生成糾錯(cuò)碼的過程。
5、穿插放置。把數(shù)據(jù)碼和糾錯(cuò)碼的各個(gè)8位一組的十進(jìn)制數(shù)(codewords)交替放在一起。如何交替呢,規(guī)則如下:
對(duì)于數(shù)據(jù)碼:把每個(gè)塊的第一個(gè)codewords先拿出來按順度排列好,然后再取第一塊的第二個(gè),如此類推。對(duì)于糾錯(cuò)碼:規(guī)則也是一樣。
然后按數(shù)據(jù)碼在前糾錯(cuò)碼在后合并起來。
6、加上Reminder Bits,對(duì)于某些Version的QR,上面的還不夠長度,還要加上Remainder Bits,比如:5Q版的二維碼,還要加上7個(gè)bits,Remainder Bits加零就好了。關(guān)于哪些Version需要多少個(gè)Remainder bit,可以參看文檔的第15頁的Table-1的定義表。
7、按照一定規(guī)則進(jìn)行掩碼,就是進(jìn)行異或,分散數(shù)據(jù),進(jìn)行畫圖。
- 上一篇:現(xiàn)代家庭必備的家電參考 [2018-04-09]
- 下一篇:美國貿(mào)易戰(zhàn)下 中國家電挺得住嗎? [2018-04-09]