基于Excel的QR二维码生成工具——原理及算法详解(之三)
来源:互联网 发布:apache 2.0 开源协议 编辑:程序博客网 时间:2024/05/22 16:42
在上一篇文章中我们讨论了使用工作表函数计算RS码的算法,接下来,我们将讨论生成多项式的计算以及RS码计算的VBA算法。在已经有了工作表函数计算RS码的情况下,还要探讨使用VBA的原因是因为VBA的计算速度比工作表函数快得多。
在开始探讨生成多项式之前,必须要说明的是,在QR码标准GB18284-2000的附录中已经附带了所有在QR计算中可能会需要的生成多项式,甚至不需要的都一并附上了:
但是,有意思的是,RS码的生成多项式其实并不止一个,而且QR标准中给出的并不是标准生成多项式。我尝试了使用标准生成多项式所计算的纠错码,将其填充到QR矩阵中后,同样能够正确解码而且能够正确地纠错。因此,如果没有耐心,只想寻求干货的同学可以绕过这一段,而有兴趣的同学可以一起探讨一下,使用不同的生成多项式来创建与QR标准中完全不同的二维码。
我们知道标准生成多项式的公式为:
我们可以如同上一节中一样,将上述多项式的计算通过一个表格来实现:
上表中使用不同的列代表多项式的不同次数的项,并且将系数写到单元格中,可见第二行表示的就是
上表中表示了这样的计算,请注意
同理我们可以用上面的表格计算
在Excel中可以很容易根据上面的表格来构造
需要注意的是,在上面的算法中表格的最左列是
好了,现在我们已经完成了生成多项式的构造,并且探讨了RS码的表格式计算算法。已经完全可以开始进行QR的制作了么?不,没那么简单,使用工作表函数的RS码在进行小规模计算时,计算速度是完全可以胜任的,但是,如果填充的是高版本的QR码,计算量就非常可观了。通常情况下,一个QR码需要对长达上百位的数据码计算30个纠错码,并且因为QR的分段设计,同样的纠错码计算需要重复几十次,这样就导致计算表十分庞大,计算次数达到上百万次。我验证了一下,这样的表格在我的电脑上需要大约25秒才能完成计算,不具备实用性。因此,下面的VBA代码被用来实现同样的RS计算功能,但结果可以瞬间得到:
Private Function ECCALC(dataWords, N, k, gp)' function that calculates error correction code of the input code words by generate polynomial' codewords as first argument is the code word for which EC code is calculated' n as second argument total number of code words' k as third argument defines the number of data code words, thus n-k is the number of error correction code words' output of the function is also defined as an array that contains the error correction code' the error correction code is calculated on the galois field with primitive polynomial= x^8+x^4+x^3+x^2+1=0'Dim gpWords(), cWords(), dWords(), prod() As LongReDim gpWords(N - k), cWords(N), dWords(N), prod(N - k)Dim divider As LongDim num, EC As VariantDim i,j As Long With Sheets("RS Calc") For i = 0 To 254 GF(i) = .Cells(7, i + 6) GFP(i) = .Cells(8, i + 6) Next End With 'read genpoly i = 0 For Each num In dataWords If IsNumeric(num) Then cWords(i) = num i = i + 1 End If Next i = 0 For Each num In gp If IsNumeric(num) Then gpWords(i) = num i = i + 1 End If Next 'RS calculation starts For i = 0 To k - 1 divider = cWords(0) For j = 0 To N - 2 'calculate next code words by multiply genopoly with divider, and substract code word If j < N - k And divider <> 0 Then num = cWords(j + 1) Xor nGfMult(divider, gpWords(j + 1)) Else num = cWords(j + 1) Xor 0 End If cWords(j) = num Next Next ECCALC = cWords End Function
- 基于Excel的QR二维码生成工具——原理及算法详解(之三)
- 基于Excel的QR二维码生成工具——原理及算法详解(之二)
- 基于Excel的QR二维码生成工具——原理及算法详解(之四)
- 基于Excel的QR二维码生成工具——原理及算法详解(之五)
- 基于Excel的QR二维码生成工具——原理及算法详解(之六)
- 基于Excel的QR二维码生成工具——原理及算法详解(之七)
- 基于Excel的QR二维码生成工具——原理及算法详解(之一)
- 基于Excel的QR二维码生成工具——原理及算法详解(最终篇)
- 二维码(QR code)基本结构及生成原理
- 二维码(QR code)基本结构及生成原理
- 安卓系统下生成QR码(三)——自定义二维码的颜色
- QR的生成(二维码)
- Android应用--QR的生成(二维码)
- Android应用--QR的生成(二维码)
- Android应用--QR的生成(二维码)
- Android应用--QR的生成(二维码)
- 安卓系统下生成QR码(二)——自定义二维码的纠错等级
- Javascript生成二维码(QR)
- HDU 5556 Land of Farms(枚举 匈牙利)
- 软件测试[(美)ron patton]11
- 抓包工具fiddler安装及查看数据
- QT界面切换前做一系列逻辑判断问题
- Java 面试题目总结
- 基于Excel的QR二维码生成工具——原理及算法详解(之三)
- Node.js合并复用html模板
- python协程
- 使用字体库和TextView代替ImageView展示图片
- Linux 命令行命令及参数辨异
- 随笔 | Iterm2 配色方案
- 基于MCP2515的Linux CAN总线驱动程序设计(二)
- Hadoop Ha (High avilable)配置
- 文档总结2-Linux目录与正则表达式