作者的前言
大家好啊,歡迎進入我的文章啊。今天開了個新坑:趣知識
好久沒有更新文章,昨天打開簡書才發(fā)現(xiàn),我漲粉了。
我也算個簡書的新人,距離上上個文章更新也是2019年了。
希望大家給我一個鼓勵,求看完,求評論。
就這些,進入正題吧!
正文:二維碼的前身——條形碼
首先你至少要知道這些碼的都表示二進制數(shù)(0與1),這些二進制數(shù)在掃描時會轉(zhuǎn)換成字符串。另外,里面的豎線表示1,空白表示0。
豎線和空白都有 4 種寬度。最細(xì)的豎線代表一個 1,之后是兩個 1,三個 1,最粗的豎線就是 4 個 1。對應(yīng)的,4 種間隔寬度就是 0、00、000、0000。
每 2 條豎線加 2 條間隔就能表示一個數(shù)字,條形碼的 48 條豎線和間隔就可以表示 12 位數(shù)字編號了。
而所有條形碼都有一個啟示碼和終止碼,它們都是一條豎線加一條空白加一條豎線(101)。它們有什么用呢?它可以確定條形碼的最細(xì)寬度(確定一個1或一個0的長度是多寬),這樣你把碼打印成多大、多小,機器都能知道你掃描的數(shù)據(jù)。
如果掃反了怎么辦?其實除了固定的啟示碼和終止碼,還有一個組合是固定的,哪就是在中間的中間碼,即01010。我們把中間碼左側(cè)的豎線里表里的白色變成黑色、黑色變成白色,放在分隔符右側(cè)的編碼。巧妙的地方在于,左側(cè)所有組合里黑色的個數(shù)都是奇數(shù) ,而右側(cè)都是偶數(shù)。
這樣,掃碼器從左往右讀取數(shù)據(jù)時只要發(fā)現(xiàn)一組數(shù)據(jù)里的 1 是偶數(shù),那么就可以確認(rèn)掃反了。用逆碼表解讀數(shù)字,再重新組合,就能得到正確編號。
最后,第十二位是根據(jù)前 11 位數(shù)計算出來的校驗碼,防止因為污漬而掃描成別的信息。
校驗碼公式:

回顧一下這種設(shè)計的好處:
1.起始碼確定了最細(xì)寬度
2.中間碼、把左邊相反的數(shù)放到右邊的組合防止了掃反的問題
3.校驗碼說明了數(shù)據(jù)無錯
雖然這三重設(shè)計保證了條形碼可以適應(yīng)各種復(fù)雜的現(xiàn)實情況,非??煽?。但是它承載的信息太少,只能存儲固定格式的數(shù)據(jù),而且弄上了污漬只能檢測出來,不能知道弄上污漬前的數(shù)據(jù)。畢竟超市的收銀員如果發(fā)現(xiàn)數(shù)據(jù)錯誤,也會自己手動輸物品編碼(一般條形碼下面都會打印物品編碼),這種碼運用的領(lǐng)域只能是超市,所以就出現(xiàn)了二維碼。
附件:條形碼的結(jié)構(gòu)表

條形碼結(jié)構(gòu)表