老虎二维码(下载链接在这里)是一个基于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.5∗3.6=9 ,2.5和3.6都在有理数域内,运算结果9也在有理数域内
用来计算RS码的“伽罗华域”就是一个符合以上定义的域,同样也是封闭域,但是这个域跟有理数或整数域有一个非常大的不同的性质,那就是这是一个有限域。也就是说,伽罗华域不像是整数和有理数域,它的元素是有限的,比如伽罗华域
伽罗华域
其中:
- 32*254=91,32和254都在
GF(28) 内,乘法运算结果91也在GF(28) 内 - 120+57=65,120和57都在
GF(28) 内,加法运算结果65也在GF(2^8)内
伽罗华域的上述性质让它在密码计算领域非常受重视,而且得到非常广泛的应用。同样,QR码也利用了伽罗华域的这个性质,不错!RS的计算其实就是密码计算!
为了计算RS纠错码,通常的资料上都说,使用数据码多项式对生成多项式求余,得到的余数多项式就是纠错码,而这里所涉及的所有多项式计算,都是在伽罗华域
因此,计算RS码的第一步就是求出
从QR Specification(GB18284-2000)中我们知道,用于计算QR码的多项式是在以多项式:
为模的伽罗华域
这所有的元素如果写成二进制,则刚好可以表示成多项式的形式,多项式的每一项的指数数表示二进制数的位数,而多项式的系数(1或0)则表示该位上的数字,如下面的多项式
表示的数字就为:
从左到右分别是这个二进制数的第8位、第7位依次到第0位。多项式指数为8的项系数为1,二进制数的第8位就为1,依次下来第4,3,2位都为1,多项式指数为4,3,2的三项同样为1.指数为0时,该项为1,其他所有位的数字为0。所以这个多项式就表示了这样一个二进制数。
了解以上定义后,还需要知道,在伽罗华域上定义了加法和乘法两种运算:
- 加法运算:定义为两个元素的异或运算
- 乘法运算:定义为两个元素的x的幂次相加并
因此,GF(2^8)上的元素就可以计算为:
上式是因为
注意到了么,上面式子里
255个元素当然不可能全手工计算,在Excel中,我使用了下面的工作表函数来计算出所有的元素值:
具体的工作表函数很简单,我就不一一列出了,这样可以很快计算出
到这里,我们已经计算出了伽罗华域的所有元素,在下篇文章中,我们将探讨RS纠错码的计算,生成多项式的计算等内容