生成二維碼的過(guò)程就是將信息轉(zhuǎn)換成二維碼的過(guò)程,掃碼的過(guò)程則是將二維碼再轉(zhuǎn)換成信息的過(guò)程,所以二維碼本質(zhì)上只是信息的一種展示形式而已 。二維碼結(jié)構(gòu)分析雖然二維碼看起來(lái)是毫無(wú)規(guī)律的,但其實(shí)二維碼的生成有著固定的格式 。大小二維碼的大小存在 40 種版本(Version),從Version1(21x21的正方形)到Version40(177x177的正方形),每增加一個(gè) Version,大小都會(huì)增加 4 。
版本越大二維碼就會(huì)越大,隨之所能表示的數(shù)據(jù)量也就越大 。結(jié)構(gòu)二維碼呈正方形,通常由黑白小方塊組成,二維碼的整體結(jié)構(gòu)可以分為定位標(biāo)記、功能區(qū)以及數(shù)據(jù)區(qū)三大部分:定位標(biāo)記——在二維碼的左上角、右上角、左下角有3個(gè)類似“回”字的方形圖案,這3個(gè)圖案是用于二維碼的定位標(biāo)記 。正因?yàn)橛卸ㄎ粯?biāo)記的存在,所以不管我們以什么角度掃描,二維碼總是可以被準(zhǔn)確的識(shí)別出來(lái) 。
二維碼中還存在一些小一點(diǎn)“回”字,它們是用于校正定位的標(biāo)記,并且只會(huì)在Version 2及以上版本的二維碼中才會(huì)出現(xiàn) 。功能區(qū)——功能區(qū)分為兩部分,即圖中紅色部分和紫色部分 。紅色部分存放格式信息,用于表示該二維碼的糾錯(cuò)級(jí)別(至于糾錯(cuò)級(jí)別是什么后面在解釋),紫色部分存放版本信息,即該二維碼的尺寸大小 。數(shù)據(jù)區(qū)——數(shù)據(jù)區(qū)指的是除去定位標(biāo)記和功能區(qū)的其他部分(圖中灰色部分),用于保存二維碼實(shí)際所表示的信息的數(shù)據(jù)碼以及用于糾錯(cuò)的糾錯(cuò)碼 。
糾錯(cuò)級(jí)別二維碼一般有一定的容錯(cuò)率,所以即使二維碼被遮擋住一部分,仍然可以被掃描出來(lái),原理就是在生成二維碼的過(guò)程中對(duì)數(shù)據(jù)做了冗余處理,冗余程度越高容錯(cuò)率就越高(糾錯(cuò)級(jí)別越高),二維碼能被遮擋的部分自然也就越多 。二維碼的糾錯(cuò)級(jí)別從低到高分為L(zhǎng)(7%)、M(15%)、Q(25%)、H(30%)4個(gè)等級(jí),如果需要在二維碼中間加logo,那么我們就應(yīng)該生成H級(jí)別的二維碼,但也并不是糾錯(cuò)級(jí)別越高越好,級(jí)別越高需要冗余的數(shù)據(jù)就越多,那么生成的二維碼的復(fù)雜程度也就越高,實(shí)際使用過(guò)程中我們應(yīng)該根據(jù)需求選擇合適的糾錯(cuò)級(jí)別 。
編碼模式我們都知道計(jì)算機(jī)只認(rèn)二進(jìn)制信息,所以我們需要把字符串中的數(shù)字、字母、漢字以及各種字符統(tǒng)一轉(zhuǎn)換成由0和1組成的二進(jìn)制數(shù)字串計(jì)算機(jī)才能識(shí)別,所以生成二維碼的過(guò)程就是將字符串轉(zhuǎn)換成二進(jìn)制數(shù)字串的過(guò)程 。最后生成的二進(jìn)制數(shù)字串對(duì)應(yīng)到二維碼上,0對(duì)應(yīng)白色的小方塊、1對(duì)應(yīng)黑色小方塊,按照8個(gè)一組依次填充到數(shù)據(jù)區(qū)就是一個(gè)完整的可以被識(shí)別的二維碼了 。
根據(jù)源字符串類型,二維碼主要支持4種標(biāo)準(zhǔn)化的編碼模式,分別為數(shù)字編碼、字符編碼、字節(jié)編碼以及日文編碼,當(dāng)然也支持其他一些特殊的字符集編碼以及混合編碼 。每種編碼模式對(duì)應(yīng)一個(gè)4位的二進(jìn)制的編碼模式指示符:下面以字符編碼舉個(gè)例子,現(xiàn)在有字符串“HELLO WORLD”1、模式指示符——根據(jù)查表可知HELLO WORLD需要使用字符編碼模式,所以它的模式指示符為0010 。
2、字符計(jì)數(shù)指示符——表示源字符串的長(zhǎng)度,字符計(jì)數(shù)指示符必須放在模式指示符之后 。字符計(jì)數(shù)指示符的計(jì)算依賴于二維碼的版本以及編碼模式:以版本1為例,字符編碼需要9bits,HELLO WORLD長(zhǎng)度為11,轉(zhuǎn)為二進(jìn)制為1011,不足9位,左邊補(bǔ)5個(gè)0得到最終結(jié)果000001011,加上模式指示符目前我們得到的二進(jìn)制數(shù)字串為0010 000001011 。
3、對(duì)原字符串編碼,將HELLO WORLD兩兩分組得到(H,E)、 (L,L)、(O, )、(W,O)、(R,L)、(D);根據(jù)索引表找到每個(gè)字符對(duì)應(yīng)的值,得到(17,14)、 (21,21)、(24,36)、(32,24)、(27,21)、(13);將每組數(shù)字先轉(zhuǎn)成45進(jìn)制、再將結(jié)果轉(zhuǎn)成長(zhǎng)度11的二進(jìn)制串,長(zhǎng)度不足的補(bǔ)0 。
推薦閱讀
- 娛樂(lè)圈中說(shuō)的玩票是什么意思,玩票性質(zhì)是什么意思
- 《天天酷跑》新坐騎九色鹿上線時(shí)間,天天酷跑九色鹿什么時(shí)候出
- 哪種品牌的筆記本電腦好,買(mǎi)什么筆記本電腦好
- 最早的單反相機(jī)是什么時(shí)候,單反相機(jī)一般什么時(shí)候降價(jià)
- 可以分期的借款平臺(tái)有哪些,有什么可以分期的網(wǎng)站嗎
- 為什么生日對(duì)很多人來(lái)說(shuō)都這么重要呢 生日的意義
- 陽(yáng)光房吊頂用什么材料
- 歐派櫥柜材料是什么材質(zhì)
- 谷歌鏡像網(wǎng)址,2021谷歌鏡像站大全
- 裝修用什么板防火
