二维码的原理竟如此简单,第一次有人说的这么明白
一維碼(條形碼)
在介紹二維碼之前,先來看看它的“大哥”一維碼,一維碼也叫條形碼(P.S. 好像在日常生活中都是叫這個(gè)),它是由不同寬度的黑條和白條按照一定的順序排列組成的平行線圖案,它的寬度記錄著數(shù)據(jù)信息,長度沒有記錄信息,條形碼常用于標(biāo)出物品的生產(chǎn)國、制造廠家、商品名稱、生產(chǎn)日期、圖書分類號(hào)、郵件起止地點(diǎn)、類別、日期等信息,比如大部分食品包裝袋背后都會(huì)印有條形碼。
一維碼(條形碼)編碼規(guī)則
全球的條形碼標(biāo)準(zhǔn)都是由一個(gè)叫GS1的非營利性組織管理和維護(hù)的,通常情況下條形碼由?95?條紅或黑色的平行豎線組成,前三條是由黑-白-黑?組成,中間的五條由白-黑-白-黑-白組成,最后的三條和前三條一樣也是由黑-白-黑組成,這樣就把一個(gè)條形碼分為左、右兩個(gè)部分。剩下的 84 (95-3-5-3=84) 條按每 7 條一組分為 12 組,每組對(duì)應(yīng)著一個(gè)數(shù)字,不同的數(shù)字的具體表示因編碼方式而有所不同,不過都遵循著一個(gè)規(guī)律:右側(cè)部分每一組的白色豎線條數(shù)都是奇數(shù)個(gè)。這樣不管你是正著掃描還是反著掃描都是可以識(shí)別的。
中國使用的條形碼大部分都是?EAN-13?格式的,條形碼數(shù)字編碼的含義從左至右分別是前三位標(biāo)識(shí)來源?國家編碼(參考資料 1)?,比如中國為:690–699,后面的 4 ~ 8 位數(shù)字代表的是廠商公司代碼,但是位數(shù)不是固定的,緊接著后面 的 9~12 位是商品編碼,第 13 位是校驗(yàn)碼,這就意味著公司編碼越短,剩余可用于商品編碼的位數(shù)也越多,可表示的商品也就越多,當(dāng)然公司代碼出售價(jià)格也相應(yīng)更昂貴,另外用在商品上的?EAN-13?條碼是要到?國家物品編碼中心(參考資料 2)?去申請(qǐng)的。
二維碼
二維碼?是在一維碼的基礎(chǔ)之上擴(kuò)展出來的,二維碼有不同的種類,大體上可以分為這兩種 ① 堆疊式/行排式二維條碼 ② 矩陣式二維碼,其中矩陣式二維碼最為流行(下文的二維碼指矩陣式二維碼),它與一維碼所不同的是它的寬度和長度均有記錄數(shù)據(jù)信息,存儲(chǔ)的數(shù)據(jù)量更大,除此之外還增加了“定位點(diǎn)”和“容錯(cuò)機(jī)制”。通過“定位點(diǎn)”使讀碼機(jī)正確識(shí)別進(jìn)行解讀,所以二維碼不管是從何種方向讀取都是可以被識(shí)別的。“容錯(cuò)機(jī)制”可以在沒有識(shí)別到全部條碼時(shí)也能正確推斷和還原出原始的條碼信息,維碼的糾錯(cuò)級(jí)別,按照不同的糾錯(cuò)率(全部碼字與可以糾錯(cuò)的碼字的比率)分為 L (約 7%)、M (約 15%)、Q (約 25%)、H (約 30%) 四個(gè)不同的級(jí)別。比如下面的「企鵝杏仁技術(shù)站」二維碼盡管中間有公眾號(hào)頭像,但是依然可以正確識(shí)別出來就是這個(gè)“容錯(cuò)機(jī)制”的功能。不管是條形碼(一維碼)還是二維碼其本質(zhì)上都是對(duì)信息的編碼,區(qū)別只是對(duì)信息的編碼方式有所不同。
二維碼的結(jié)構(gòu)
二維碼的版本從 1 ~ 40 共 40 個(gè)不同的版本,每個(gè)版本的基本結(jié)構(gòu)都是相同的,所不同的是每個(gè)版本的碼元(構(gòu)成二維碼的方形黑白點(diǎn))數(shù)量不同,從版本 1 (21 × 21 碼元) 至版本 40 (177 × 177 碼元) 依次遞增。
二維碼可以分為這幾不同的功能區(qū)域,分別是 版本信息、格式信息、數(shù)據(jù)及容錯(cuò)、定位標(biāo)志、校正標(biāo)志 等主要區(qū)域,其中定位標(biāo)識(shí)用來對(duì)二維碼進(jìn)行定位,版本信息表示二維碼的版本,有 40 種不同版本的二維碼,從版本 1 到版本 40 ,每一版本比前一個(gè)版本每邊增加 4 個(gè)碼元,數(shù)據(jù)及容錯(cuò)用于實(shí)際保存的二維碼數(shù)據(jù)信息和用于修正二維碼損壞帶來的錯(cuò)誤的糾錯(cuò)碼字,二維碼的編碼規(guī)則比較復(fù)雜,感興趣的朋友可以去看看它的編碼規(guī)范。
普通二維碼存在的問題
以上介紹的這種普通二維碼只是對(duì)文字、網(wǎng)址、電話等信息進(jìn)行編碼,不支持圖片、音頻、視頻等內(nèi)容,且生成二維碼后內(nèi)容無法改變,在信息內(nèi)容較多時(shí)生成的二維碼圖案復(fù)雜,不容易識(shí)別和打印,正是由于存在這些特性故稱之為靜態(tài)二維碼。靜態(tài)二維碼的好處就是無需聯(lián)網(wǎng)也能識(shí)別,但是有些時(shí)候在線下場景經(jīng)常需要打印二維碼出來讓用戶去掃碼,或者在一些運(yùn)營場景下需要對(duì)用戶的掃碼情況進(jìn)行數(shù)據(jù)統(tǒng)計(jì)和分析,再使用普通的二維碼就無法提供這些功能了,這時(shí)候就要使用動(dòng)態(tài)二維碼了。
動(dòng)態(tài)二維碼(活碼)及其原理
動(dòng)態(tài)二維碼也稱之為活碼,關(guān)鍵就在于“活”,“活”就是內(nèi)容可變,但是二維碼不變。活碼的優(yōu)點(diǎn)其實(shí)就是靜態(tài)二維碼的缺點(diǎn),支持隨時(shí)修改二維碼的內(nèi)容且二維碼圖案不變,可跟蹤掃描統(tǒng)計(jì)數(shù)據(jù),支持存儲(chǔ)大量文字、圖片、文件、音視、視頻等內(nèi)容,同時(shí)生成的圖案簡單易掃。實(shí)際上二維碼是按照指定的規(guī)則編碼后的一串字符串,通常大部分情況下是一個(gè)網(wǎng)址,在二維碼出現(xiàn)之前,我們訪問一個(gè)網(wǎng)址是打開瀏覽器輸入網(wǎng)址后按下回車即可訪問相應(yīng)的網(wǎng)站,而有了二維碼之后,我們使用軟件掃描二維碼,軟件首先會(huì)做一次從二維碼到文本的解析、轉(zhuǎn)換,然后根據(jù)解析出來的文本結(jié)果判斷是否是鏈接,是則跳轉(zhuǎn)到這個(gè)鏈接,盡管對(duì)我們而言操作方式改變了,但其原理是相同的。
既然二維碼背后是網(wǎng)址,要解決靜態(tài)二維碼生成后內(nèi)容無法修改的問題,是不是只要把網(wǎng)址做成“活的”就行了,即可操控內(nèi)容的鏈接,對(duì)外暴露的依然還是同一個(gè)網(wǎng)址,服務(wù)端只需要對(duì)這個(gè)網(wǎng)址做個(gè)二次跳轉(zhuǎn)就行,實(shí)際上“活碼”就是這么干的,這個(gè)對(duì)外暴露固定不變的網(wǎng)址也稱為“活址”。此時(shí)腦海里浮現(xiàn)著計(jì)算機(jī)科學(xué)界一句著名的話:
計(jì)算機(jī)科學(xué)的任何一個(gè)問題,都可以通過增加一個(gè)中間層來解決。
上面的這個(gè)“活址”就是一個(gè)“中間層”的角色,屏蔽和隔離了二維碼內(nèi)容的變化,對(duì)外始終都只是暴露一個(gè)固定的網(wǎng)址。
靜態(tài)二維碼和動(dòng)態(tài)二維碼(活碼)的區(qū)別
| 內(nèi)容修改 | 不支持 | 可以隨時(shí)修改 |
| 內(nèi)容類型 | 支持文字、網(wǎng)址、電話等 | 支持文字、圖片、文件、音視、視頻等內(nèi)容 |
| 二維碼圖案 | 內(nèi)容越多越復(fù)雜 | 活碼圖案簡單 |
| 數(shù)據(jù)統(tǒng)計(jì) | 不支持 | 支持 |
| 樣式排版 | 不支持 | 支持 |
總結(jié)
本文主要對(duì)條形碼、靜態(tài)二維碼和動(dòng)態(tài)二維碼的一些基本概念做了簡單的介紹,想要深入了解二維碼的實(shí)現(xiàn)細(xì)節(jié)和原理的朋友可以看看耗子叔的這篇文章?二維碼的生成細(xì)節(jié)(參考資料 4)和原理?或者到?官網(wǎng)(參考資料 5)查看相關(guān)文檔。雖然現(xiàn)在絕大部分人對(duì)于二維碼都非常熟悉,幾乎每天都會(huì)進(jìn)行著掃碼操作,不過在人們的大腦中依然有一個(gè)“根深蒂固”的認(rèn)知,認(rèn)為一個(gè)二維碼掃描之后只會(huì)出現(xiàn)一種固定的結(jié)果,在接觸?活碼?這個(gè)概念之前俺也是。你知道的越多,不知道的也越多。
參考資料
1、https://en.wikipedia.org/wiki/List_of_GS1_country_codes
2、http://www.ancc.org.cn/
3、https://coolshell.cn/articles/10590.html
4、https://www.qrcode.com/zh/index.html
全文完
以下文章您可能也會(huì)感興趣:
簡單說說spring的循環(huán)依賴
Mysql redo log 漫游
一個(gè) AOP 緩存失效問題的排查
小程序開發(fā)的幾個(gè)好的實(shí)踐
RabbitMQ 如何保證消息可靠性
在 SpringBoot 中使用 STOMP 基于 WebSocket 建立 BS 雙向通信
聊聊Hystrix 命令執(zhí)行流程
HIS 系統(tǒng)前端重構(gòu)經(jīng)驗(yàn)
SpringFox 源碼分析(及 Yapi 問題的另一種解決方案)
Mysql 的字符集以及帶來的一點(diǎn)存儲(chǔ)影響
我們正在招聘 Java 工程師,歡迎有興趣的同學(xué)投遞簡歷到 rd-hr@xingren.com 。
總結(jié)
以上是生活随笔為你收集整理的二维码的原理竟如此简单,第一次有人说的这么明白的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用 zotero 管理文献和个人知识库
- 下一篇: 《深度学习》之 目标检测 最全详解 (一