解析二維碼,二維碼在線生成( 二 )


糾錯級別二維碼一般有一定的容錯率,所以即使二維碼被遮擋住一部分,仍然可以被掃描出來,原理就是在生成二維碼的過程中對數據做了冗余處理,冗余程度越高容錯率就越高(糾錯級別越高),二維碼能被遮擋的部分自然也就越多 。二維碼的糾錯級別從低到高分為L(7%)、M(15%)、Q(25%)、H(30%)4個等級,如果需要在二維碼中間加logo,那么我們就應該生成H級別的二維碼,但也并不是糾錯級別越高越好,級別越高需要冗余的數據就越多,那么生成的二維碼的復雜程度也就越高,實際使用過程中我們應該根據需求選擇合適的糾錯級別 。
編碼模式我們都知道計算機只認二進制信息,所以我們需要把字符串中的數字、字母、漢字以及各種字符統一轉換成由0和1組成的二進制數字串計算機才能識別,所以生成二維碼的過程就是將字符串轉換成二進制數字串的過程 。最后生成的二進制數字串對應到二維碼上,0對應白色的小方塊、1對應黑色小方塊,按照8個一組依次填充到數據區就是一個完整的可以被識別的二維碼了 。
根據源字符串類型,二維碼主要支持4種標準化的編碼模式,分別為數字編碼、字符編碼、字節編碼以及日文編碼,當然也支持其他一些特殊的字符集編碼以及混合編碼 。每種編碼模式對應一個4位的二進制的編碼模式指示符:下面以字符編碼舉個例子,現在有字符串“HELLO WORLD”1、模式指示符——根據查表可知HELLO WORLD需要使用字符編碼模式,所以它的模式指示符為0010 。
2、字符計數指示符——表示源字符串的長度,字符計數指示符必須放在模式指示符之后 。字符計數指示符的計算依賴于二維碼的版本以及編碼模式:以版本1為例,字符編碼需要9bits,HELLO WORLD長度為11,轉為二進制為1011,不足9位,左邊補5個0得到最終結果000001011,加上模式指示符目前我們得到的二進制數字串為0010 000001011 。
3、對原字符串編碼,將HELLO WORLD兩兩分組得到(H,E)、 (L,L)、(O, )、(W,O)、(R,L)、(D);根據索引表找到每個字符對應的值,得到(17,14)、 (21,21)、(24,36)、(32,24)、(27,21)、(13);將每組數字先轉成45進制、再將結果轉成長度11的二進制串,長度不足的補0 。
例如(17,14) 轉成45進制為17*45 14=779,再將779轉成二進制 1100001011,左邊補1個0得到01100001011,如果最后一組是單獨一個,則轉成6位的二進制串,所以字符串HELLO WORLD經過字符編碼之后,再加上前面計算好的模式指示符和字符計數指示符之后最終得到0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101 。
4、 在確定二維碼的版本和糾錯級別以后,字符串的編碼結果應該是一個固定長度的二進制串,如果我們計算的結果長度不夠就需要進行不起操作 。例如確定二維碼的版本1和糾錯級別Q,則最終二進制串的長度需要達到104位 。在第3步中我們得到的最二進制串的長度為74,所以需要進行補齊操作 。首先末尾可以至多追加4個0,接著末尾補齊更多的0直到長度是8的倍數,如追加4個0后長度達到78,要達到8的倍數則還需要補2個0;如果這時候長度還沒有達到目標,那就在末尾循環追加固定的二進制碼11101100 00010001直到達到目標長度 。
最后來看一下HELLO WORLD經過字符編碼之后結果掩碼圖源字符串在經過編碼之后被轉換成二進制的數字串,根據這個二進制數字串畫出來的二維碼通常會存在黑白色塊分布不均的情況,這會導致二維碼容易掃描失敗 。為了解決這個問題,官方提供了8種掩碼方案:我們需要選擇一個掩碼圖與我們生成的二維碼再做一次異或操作,這樣黑白色塊分布就會更加的均勻 。

推薦閱讀