-
1 # 嘉靖不上朝
-
2 # 原始碼科技
其實現思路跟一維碼,如條形碼一致,即將字串透過特殊編碼,使用若干個與二進位制相對應的幾何形體來表示數字和文字,並透過影象輸入裝置或光電掃描裝置自動識別,以實現資訊自動處理還原。
-
3 # 控制研究控
我來簡單說兩句:
先說一下ASCII碼,因為了解了ASCII碼,就瞭解了字元如何轉換為二進位制數,而計算機就是擅長處理二進位制數!字元,符號,數字這些在早期的計算機編碼中工程技術人員將一些常規的和二進位制數的對應關係做了一個公認的規劃,也就是ANSI搞的ASCII編碼,或者叫8421碼吧!
早期的這個ASCII碼,只是用到了一個位元組長度可以表示的範圍中的0-127值,也就是說開始值有128個值對應128種字元,而一個位元組8位最大值是255,因此後來又擴充套件成擴充套件的ASCII碼,這也就能表示256種字元了!
當然,後來各國為了滿足自己的文字字元等和二進位制值能對應起來,又不斷的充實了Unicod碼,讓更多的字元,符號,文字等能和二進位制值一一對應起來!
瞭解了字元和二進位制的關係後,再來看二維碼的原理二維碼呢,就是用一些特定的幾何圖形也讓他們與二進位制值對應起來,這樣字元可以轉化為一個二進位制數,幾何圖形也能轉化為二進位制數,那麼透過二進位制數就建立了字元和圖形之間的直接聯絡!---也因此,字串可以轉化為二維碼,而看到二維碼後,也可以解析成字串!
---原理就是大家都約定好通一個值表示什麼字元的同時,又可以用怎樣圖形表示,說白了就是等值交換吧!
-
4 # 萌新程式設計師成長日記
大小
結構
定位標記——在二維碼的左上角、右上角、左下角有3個類似“回”字的方形圖案,這3個圖案是用於二維碼的定位標記。正因為有定位標記的存在,所以不管我們以什麼角度掃描,二維碼總是可以被準確的識別出來。二維碼中還存在一些小一點“回”字,它們是用於校正定位的標記,並且只會在Version 2及以上版本的二維碼中才會出現。
糾錯級別
二維碼的糾錯級別從低到高分為L(7%)、M(15%)、Q(25%)、H(30%)4個等級,如果需要在二維碼中間加logo,那麼我們就應該生成H級別的二維碼,但也並不是糾錯級別越高越好,級別越高需要冗餘的資料就越多,那麼生成的二維碼的複雜程度也就越高,實際使用過程中我們應該根據需求選擇合適的糾錯級別。
編碼模式我們都知道計算機只認二進位制資訊,所以我們需要把字串中的數字、字母、漢字以及各種字元統一轉換成由0和1組成的二進位制數字串計算機才能識別,所以生成二維碼的過程就是將字串轉換成二進位制數字串的過程。
每種編碼模式對應一個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。
在第3步中我們得到的最二進位制串的長度為74,所以需要進行補齊操作。首先末尾可以至多追加4個0,接著末尾補齊更多的0直到長度是8的倍數,如追加4個0後長度達到78,要達到8的倍數則還需要補2個0;如果這時候長度還沒有達到目標,那就在末尾迴圈追加固定的二進位制碼11101100 00010001直到達到目標長度。
最後來看一下HELLO WORLD經過字元編碼之後結果
為了解決這個問題,官方提供了8種掩碼方案:
-
5 # 每日精彩科技
用某種特定的幾何圖形按一定規律在平面(二維方向上)分佈的黑白相間的圖形記錄資料符號資訊的;在程式碼編制上巧妙地利用構成計算機內部邏輯基礎的“0"、“1"位元流的概念,使用若干個與二進位制相對應的幾何形體來表示文字數值資訊,透過圖象輸入裝置或光電掃描裝置自動識讀以實現資訊自動處理。
二維條碼也有許多不同的碼制,碼制的編碼原理而言,通常三種類型:
3.郵政碼透過不同長度的條進行編碼,主要用於郵件編碼,如:Postnet、BPO 4-State。
2.編碼範圍廣:該條碼可以把圖片、聲音、文字、簽字、指紋等可以數字化的資訊進行編碼,用條碼錶示出來;可以表示多種語言文字;可表示影象資料。
3.容錯能力強,具有糾錯功能:損毀面積達50%仍可恢復資訊。
4.譯碼可靠性高:它比普通條碼譯碼錯誤率百萬分之二要低得多,誤位元速率不超過千萬分之一。
5.可引入加密措施:保密性、防偽性好。
6.成本低,易製作,持久耐用。
7.條碼符號形狀、尺寸大小比例可變。
8.二維條碼可以使用鐳射或CCD閱讀器識讀。
二維碼的應用範圍廣泛我們生活中接觸的二維碼一般都是商品和網頁資訊,有很多人使用二維碼名片等等,但二維碼的用途不僅僅如此,它儲存量大、保密性高、追蹤性高、抗損性強、備援性大、成本便宜等特性特別適用於表單、安全保密、追蹤、證照、存貨盤點、資料備援等方面。
表單應用:公文表單、商業表單、進出口報單、艙單等資料之傳送交換,減少人工重覆輸入表單資料,避免人為錯誤,降低人力成本
保密應用:商業情報、經濟情報、政治情報、軍事情報、私人情報等機密資料之加密及傳遞。
證照應用:護照、身份證、掛號證、駕照、會員證、識別證、連鎖店會員證等證照之資料登記及自動輸入,發揮[隨到隨讀]、[立即取用]的資訊管理效果。
盤點應用:物流中心、倉儲中心、聯勤中心之貨品及固定資產之自動盤點,發揮[立即盤點、立即決策]
的效果。
QR CODE QR Code 是由日本Denso公司於1994年研製的一種矩陣二維碼符號碼,全稱是Quick Response Code,可看出,超高速識讀特點是QR用CCD二維條碼識讀裝置,每秒可識讀30個含有100個字元的QR Code碼符號。
QR Code碼用特定的資料壓縮模式表示中國漢字和日本漢字,它僅用13bit可表示一個漢字,而四一七條碼、Data Martix等二維碼沒有特定的漢字表示模式,在用位元組模式表示漢字時,需用16bit表示一個漢字,因此QR Code碼比其它的二維條碼錶示漢字的效率提高了20%。
QR碼的編碼還有另一種可供選擇的符號字元佈置方法,可得到相同的結果,將整個碼字序列視為一個單獨的位流,將其(最高位開始)按從右向左,按向上和向下的方向交替的佈置於兩個模組寬的縱列中。並跳過功能圖形佔用的區域,在縱列的頂部或底部改變方向,每一位應放在第一個可用的位置。
當符號的資料容量不能恰好分為整數個8位符號字元時,要用相應的剩餘位填充符號的容量。在進行掩模以前,這些剩餘位的值為0。
尋象圖形尋象圖形包括三個相同的位置探測圖形,分別位於符號的左上角、右上角和左下角,如圖2所示。每個位置探測圖形可以看作是由3個重疊的同心的正方形組成,它們分別為77個深色色模組、55個淺模組和33個深色模組。如下圖所示,位置探測圖形的模組寬度比為1:1:3:1:1。
符號中其他地方遇到類似圖形的可能性極小,因此可以在視場中迅速地識別可能的QR碼符號。識別組成的尋象圖形的三個位置探測圖形,可以明確地確定視場中符號的位置和方向。
出記錄的完整資訊。這使得創新設計成為可能。
-
6 # 廣義網路空間與元宇宙
二維碼又稱QR Code,QR全稱Quick Response,是一個近幾年來移動裝置上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的資訊,也能表示更多的資料型別:比如:字元,數字,日文,中文等等,用特定的幾何圖形按編排規律在二維方向上分佈,採用黑白相見的圖形來記錄資料符號資訊。
為了利用計算機內部邏輯,用數字“0”和數字“1”作為程式碼,同時使用若干個與二進位制相對應的幾何形體表示文字數值資訊,透過常見的圖象輸入裝置或光電掃描裝置,它們可以自動讀取,並且會對識別出的資訊進行自動處理。
回覆列表
二維碼又稱QR Code,QR全稱Quick Response,是一個近幾年來移動裝置上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的資訊,也能表示更多的資料型別:比如:字元,數字,日文,中文等等。這兩天學習了一下二維碼圖片生成的相關細節,覺得這個玩意就是一個密碼演算法,在此寫一這篇文章 ,揭露一下。供好學的人一同學習之。
關於QR Code Specification,可參看這個PDF:http://raidenii.net/files/datasheets/misc/qr_code.pdf
基礎知識首先,我們先說一下二維碼一共有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 的正方形。
Kanji mode 這是日文編碼,也是雙位元組編碼。同樣,也可以用於中文編碼。日文和漢字的編碼會減去一個值。如:在0X8140 to 0X9FFC中的字元會減去8140,在0XE040到0XEBBF中的字元要減去0XC140,然後把結果前兩個16進位制位拿出來乘以0XC0,然後再加上後兩個16進位制位,最後轉成13bit的編碼。如下圖示例:
下面我們看幾個示例,
示例一:數字編碼在Version 1的尺寸下,糾錯級別為H的情況下,編碼: 01234567
1. 把上述數字分成三組: 012 345 67
2. 把他們轉成二進位制: 012 轉成 0000001100; 345 轉成 0101011001; 67 轉成 1000011。
3. 把這三個二進位制串起來: 0000001100 0101011001 1000011
4. 把數字的個數轉成二進位制 (version 1-H是10 bits ): 8個數字的二進位制是 0000001000
5. 把數字編碼的標誌0001和第4步的編碼加到前面: 0001 0000001000 0000001100 0101011001 1000011
示例二:字元編碼在Version 1的尺寸下,糾錯級別為H的情況下,編碼: AC-42
1. 從字元索引表中找到 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 轉成 000010
4. 把這些二進位制連線起來:00111001110 11100111001 000010
5. 把字元的個數轉成二進位制 (Version 1-H為9 bits ): 5個字元,5轉成 000000101
6. 在頭上加上編碼標識 0010 和第5步的個數編碼: 0010 000000101 00111001110 11100111001 000010
結束符和補齊符假如我們有個HELLO WORLD的字串要編碼,根據上面的示例二,我們可以得到下面的編碼,
編碼字元數HELLO WORLD的編碼001000000101101100001011 01111000110 10001011100 10110111000 10011010100 001101我們還要加上結束符:
編碼字元數HELLO WORLD的編碼結束001000000101101100001011 01111000110 10001011100 10110111000 10011010100 0011010000按8bits重排如果所有的編碼加起來不是8個倍數我們還要在後面加上足夠的0,比如上面一共有78個bits,所以,我們還要加上2個0,然後按8個bits分好組:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000
補齊碼(Padding Bytes)最後,如果如果還沒有達到我們最大的bits數的限制,我們還要加一些補齊碼(Padding Bytes),Padding Bytes就是重複下面的兩個bytes:11101100 00010001 (這兩個二進位制轉成十進位制是236和17,我也不知道為什麼,只知道Spec上是這麼寫的)關於每一個Version的每一種糾錯級別的最大Bits限制,可以參看QR Code Spec的第28頁到32頁的Table-7一表。
假設我們需要編碼的是Version 1的Q糾錯級,那麼,其最大需要104個bits,而我們上面只有80個bits,所以,還需要補24個bits,也就是需要3個Padding Bytes,我們就新增三個,於是得到下面的編碼:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100
上面的編碼就是資料碼了,叫Data Codewords,每一個8bits叫一個codeword,我們還要對這些資料碼加上糾錯資訊。
錯誤修正容量L水平7%的字碼可被修正M水平15%的字碼可被修正Q水平25%的字碼可被修正H水平30%的字碼可被修正那麼,QR是怎麼對資料碼加上糾錯碼的?首先,我們需要對資料碼進行分組,也就是分成不同的Block,然後對各個Block進行糾錯編碼,對於如何分組,我們可以檢視QR Code Spec的第33頁到44頁的Table-13到Table-22的定義表。注意最後兩列:
Number of Error Code Correction Blocks :需要分多少個塊。Error Correction Code Per Blocks:每一個塊中的code個數,所謂的code的個數,也就是有多少個8bits的位元組。下圖是根據上述表格中的Version8的一個例子(6,24,42)
Format Information是一個15個bits的資訊,每一個bit的位置如下圖所示:(注意圖中的Dark Module,那是永遠出現的)
關於Error Correction Level如下表所示:
Version Information一共是18個bits,其中包括6個bits的版本號以及12個bits的糾錯碼,下面是一個示例:
資料和資料糾錯碼然後是填接我們的最終編碼,最終編碼的填充方式如下:從左下角開始沿著紅線填我們的各個bits,1是黑色,0是白色。如果遇到了上面的非資料區,則繞開或跳過。
掩碼圖案這樣下來,我們的圖就填好了,但是,也許那些點並不均衡,如果出現大面積的空白或黑塊,會告訴我們掃描識別的困難。所以,我們還要做Masking操作(靠,還嫌不復雜)QR的Spec中說了,QR有8個Mask你可以使用,如下所示:其中,各個mask的公式在各個圖下面。所謂mask,說白了,就是和上面生成的圖做XOR操作。Mask只會和資料區進行XOR,不會影響功能區。(注:選擇一個合適的Mask也是有演算法的)
下面是Mask後的一些樣子,我們可以看到被某些Mask XOR了的資料變得比較零散了。
<img size-full="" wp-image-10615"="" src="https://coolshell.cn/wp-content/uploads/2013/10/Masking-Examples.png" width="616" height="446">
參考:https://www.cnblogs.com/alantu2018/p/8504373.html