基於Excel的QR二維碼生成工具——原理及算法詳解(之一)

老虎二維碼(下載鏈接在這裏)是一個基於Excel的二維碼生成工具,完全使用Excel表單公式結合VBA實現,沒有調用任何外部庫,實現了支持中文英文混合字符以及常用微信二維碼編碼的自動生成,在工作表單元格中填充二維碼,並可以保存爲圖片複製到剪貼板中。
老虎二維碼界面

老虎二維碼工具從編碼構造、RS碼計算一直到QR碼的填充全部都通過VBA或工作表函數實現的。爲了完成這個工具,花了兩個月的時間研究了QR Specification,尤其是裏德所羅門算法生成RS糾錯碼的算法,終於實現了Excel中的生成算法。由於在研究的過程中發現很難找到一份詳細完整的資料,能夠將二維碼尤其是RS碼的計算算法講清楚,因此決定寫幾篇文章,詳細介紹基於Excel的二維碼編碼算法,並且儘量提供更多的乾貨,以便後來的同好共同學習

掃描試試看

先從RS糾錯碼開始吧!

RS糾錯碼可以說是QR碼編碼過程中至關重要的關鍵,但是這部分關鍵的內容在QR Specifications以及後來的GB18284-2000中都語焉不詳地一筆帶過,網上找過很多大神寫的文章同樣對這個神祕的RS碼也是諱莫如深,更加增添了它的神祕感。因此,我特意將這部分內容放在整篇文章之首,就是爲了讓大家更快地瞭解這個RS碼的Excel計算算法的實現過程

在開始之前,我必須說,對於RS碼計算的基礎,也就是羣論等高深的數學知識,其實我也沒有搞懂,但是感謝網絡上提供各種知識片段的大神們,讓我能夠經過不懈努力拼湊出了整個算法的全貌

首先,RS碼的計算不是在我們所熟悉的有理數域上實現的,而是在一個名爲“伽羅華域”的奇怪的域上進行的,這裏簡單介紹一下域的概念:如果一個數的集合,且這個集合上定義了+和X兩種運算,如果這個集合中的元素對“+”運算和“X”運算都滿足交換律,而且“X”運算對“+”運算滿足結合律,那麼就將這個集合以及兩種運算稱爲一個域。打個比方說,所有的整數以及運算加法和乘法就是一個域,稱爲整數域,同樣,有理數的加法和乘法也是一個域,稱爲有理數域。而且他們都是封閉域,因爲他們的計算結果仍然在域內:

  • 1+2=3 ,1和2都屬於整數,運算結果3也屬於整數
  • 2.53.6=9 ,2.5和3.6都在有理數域內,運算結果9也在有理數域內

用來計算RS碼的“伽羅華域”就是一個符合以上定義的域,同樣也是封閉域,但是這個域跟有理數或整數域有一個非常大的不同的性質,那就是這是一個有限域。也就是說,伽羅華域不像是整數和有理數域,它的元素是有限的,比如伽羅華域GF28 只有255個元素,但是這255個元素中任意兩個在這個域上定義的運算法則下(它也有加法與乘法)的計算結果也永遠在這255個元素以內,比如:

伽羅華域GF28 內的元素爲:{1,2,4142}

其中:

  • 32*254=91,32和254都在GF(28) 內,乘法運算結果91也在GF(28)
  • 120+57=65,120和57都在GF(28) 內,加法運算結果65也在GF(2^8)內

伽羅華域的上述性質讓它在密碼計算領域非常受重視,而且得到非常廣泛的應用。同樣,QR碼也利用了伽羅華域的這個性質,不錯!RS的計算其實就是密碼計算!

爲了計算RS糾錯碼,通常的資料上都說,使用數據碼多項式對生成多項式求餘,得到的餘數多項式就是糾錯碼,而這裏所涉及的所有多項式計算,都是在伽羅華域GF28 上進行的。

因此,計算RS碼的第一步就是求出GF28 的所有元素來。這一步我是利用Excel工作表函數實現的,這樣同樣比較可視化

從QR Specification(GB18284-2000)中我們知道,用於計算QR碼的多項式是在以多項式:

x8+x4+x3+x2+1=0

爲模的伽羅華域GF(28) 上生成的。怎麼理解呢?簡單說來,我們首先知道GF(28) 共有255個元素,而且這些元素全部都可以寫成一個元素a 的冪次的形式,元素a 是一個假想出來的元素,稱爲伽羅華域的本原元素,簡稱“本原元”,而所有的元素都是a 的冪次形式,具體來說,GF(28) 的元素包括:

a0,a1,a2,...,a254,

這所有的元素如果寫成二進制,則剛好可以表示成多項式的形式,多項式的每一項的指數數表示二進制數的位數,而多項式的係數(1或0)則表示該位上的數字,如下面的多項式

x8+x4+x3+x2+1=0

表示的數字就爲:
100011101

從左到右分別是這個二進制數的第8位、第7位依次到第0位。多項式指數爲8的項係數爲1,二進制數的第8位就爲1,依次下來第4,3,2位都爲1,多項式指數爲4,3,2的三項同樣爲1.指數爲0時,該項爲1,其他所有位的數字爲0。所以這個多項式就表示了這樣一個二進制數。
瞭解以上定義後,還需要知道,在伽羅華域上定義了加法和乘法兩種運算:
  • 加法運算:定義爲兩個元素的異或運算
  • 乘法運算:定義爲兩個元素的x的冪次相加並

因此,GF(2^8)上的元素就可以計算爲:

a0=1
a1=a
a2=a2
...
a8=a8=a4+a3+a2+1

上式是因爲a8+a4+a3+a2+1=0 ,根據異或運算的規則,有a8=a4+a3+a2+1 ,接下來還可以繼續計算a9
a9=a8a=a5+a4+a3+a
...
a12=a8+a7+a6+a4=a4+a3+a2+1+a7+a6+a4=a7+a6+a3+a2+1

注意到了麼,上面式子裏a4 項出現兩次,因此根據異或運算法則相消了。按照上面的式子以此類推就可以計算出所有GF(28) 中的元素,而且可以驗算,從a255 開始,結果就開始重複了。這些元素的多項式按照前面所述的規則表示爲二進制數,就是GF(28) 中元素的值了。如:
a12=a7+a6+a3+a2+1
>
(11001101)2=(205)10

255個元素當然不可能全手工計算,在Excel中,我使用了下面的工作表函數來計算出所有的元素值:
圖1,$GF(2^8)$工作表函數計算
具體的工作表函數很簡單,我就不一一列出了,這樣可以很快計算出GF(28) 的所有元素:

{1,2,4,8,16,32,64,128,29,58,116,232,,173,71,142}

到這裏,我們已經計算出了伽羅華域的所有元素,在下篇文章中,我們將探討RS糾錯碼的計算,生成多項式的計算等內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章