怎麼把二維碼
2023-03-29 21:54:24
基礎知識首先,我們先說一下二維碼一共有40個尺寸.官方叫版本Version.Version 1是21 x 21的矩陣,Version 2是 25 x 25的矩陣,Version 3是29的尺寸,每增加一個version,就會增加4的尺寸,公式是:(V-1)*4 + 21(V是版本號) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形.下面我們看看一個二維碼的樣例:定位圖案Position Detection Pattern是定位圖案,用於標記二維碼的矩形大小.這三個定位圖案有白邊叫Separators for Postion Detection Patterns.之所以三個而不是四個意思就是三個就可以標識一個矩形了.Timing Patterns也是用於定位的.原因是二維碼有40種尺寸,尺寸過大了後需要有根標準線,不然掃描的時候可能會掃歪了.Alignment Patterns 只有Version 2以上(包括Version2)的二維碼需要這個東東,同樣是為了定位用的.功能性數據Format Information 存在於所有的尺寸中,用於存放一些格式化數據的.Version Information 在 >= Version 7以上,需要預留兩塊3 x 6的區域存放一些版本信息.數據碼和糾錯碼除了上述的那些地方,剩下的地方存放 Data Code 數據碼 和 Error Correction Code 糾錯碼.數據編碼我們先來說說數據編碼.QR碼支持如下的編碼:Numeric mode 數字編碼,從0到9.如果需要編碼的數字的個數不是3的倍數,那麼,最後剩下的1或2位數會被轉成4或7bits,則其它的每3位數字會被編成 10,12,14bits,編成多長還要看二維碼的尺寸(下面有一個表Table 3說明了這點)Alphanumeric mode 字符編碼.包括 0-9,大寫的A到Z(沒有小寫),以及符號$ % * + – . / : 包括空格.這些字符會映射成一個字符索引表.如下所示:(其中的SP是空格,Char是字符,Value是其索引值) 編碼的過程是把字符兩兩分組,然後轉成下表的45進位,然後轉成11bits的二進位,如果最後有一個落單的,那就轉成6bits的二進位.而編碼模式和字符的個數需要根據不同的Version尺寸編成9, 11或13個二進位(如下表中Table 3)Byte mode, 字節編碼,可以是0-255的ISO-8859-1字符.有些二維碼的掃描器可以自動檢測是否是UTF-8的編碼.Kanji mode 這是日文編碼,也是雙字節編碼.同樣,也可以用於中文編碼.日文和漢字的編碼會減去一個值.如:在0X8140 to 0X9FFC中的字符會減去8140,在0XE040到0XEBBF中的字符要減去0XC140,然後把結果前兩個16進位位拿出來乘以0XC0,然後再加上後兩個16進位位,最後轉成13bit的編碼.如下圖示例:Extended Channel Interpretation (ECI) mode 主要用於特殊的字符集.並不是所有的掃描器都支持這種編碼.Structured Append mode 用於混合編碼,也就是說,這個二維碼中包含了多種編碼格式.FNC1 mode 這種編碼方式主要是給一些特殊的工業或行業用的.比如GS1條形碼之類的.簡單起見,後面三種不會在本文 中討論.下面兩張表中,Table 2 是各個編碼格式的「編號」,這個東西要寫在Format Information中.註:中文是1101Table 3 表示了,不同版本(尺寸)的二維碼,對於,數字,字符,字節和Kanji模式下,對於單個編碼的2進位的位數.(在二維碼的規格說明書中,有各種各樣的編碼規範表,後面還會提到)下面我們看幾個示例,示例一:數字編碼在Version 1的尺寸下,糾錯級別為H的情況下,編碼: 012345671. 把上述數字分成三組: 012 345 672. 把他們轉成二進位: 012 轉成 0000001100; 345 轉成 0101011001; 67 轉成 1000011.3. 把這三個二進位串起來: 0000001100 0101011001 10000114. 把數字的個數轉成二進位 (version 1-H是10 bits ): 8個數字的二進位是 00000010005. 把數字編碼的標誌0001和第4步的編碼加到前面: 0001 0000001000 0000001100 0101011001 1000011示例二:字符編碼在Version 1的尺寸下,糾錯級別為H的情況下,編碼: AC-421. 從字符索引表中找到 AC-42 這五個字條的索引 (10,12,41,4,2)2. 兩兩分組: (10,12) (41,4) (2)3.把每一組轉成11bits的二進位:(10,12) 10*45+12 等於 462 轉成 00111001110(41,4) 41*45+4 等於 1849 轉成 11100111001(2) 等於 2 轉成 0000104. 把這些二進位連接起來:00111001110 11100111001 0000105. 把字符的個數轉成二進位 (Version 1-H為9 bits ): 5個字符,5轉成 0000001016. 在頭上加上編碼標識 0010 和第5步的個數編碼: 0010 000000101 00111001110 11100111001 000010結束符和補齊符假如我們有個HELLO WORLD的字符串要編碼,根據上面的示例二,我們可以得到下面的編碼,編碼字符數HELLO WORLD的編碼0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101 我們還要加上結束符:編碼字符數HELLO WORLD的編碼結束0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101 0000 按8bits重排如果所有的編碼加起來不是8個倍數我們還要在後面加上足夠的0,比如上面一共有78個bits,所以,我們還要加上2個0,然後按8個bits分好組:00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 。