老虎二维码(下载链接在这里)是一个基于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=31+2=3,1和2都属于整数,运算结果3也属于整数
  • 2.5∗3.6=92.5*3.6=9,2.5和3.6都在有理数域内,运算结果9也在有理数域内

用来计算RS码的“伽罗华域”就是一个符合以上定义的域,同样也是封闭域,但是这个域跟有理数或整数域有一个非常大的不同的性质,那就是这是一个有限域。也就是说,伽罗华域不像是整数和有理数域,它的元素是有限的,比如伽罗华域GF(28)GF(2^8)只有255个元素,但是这255个元素中任意两个在这个域上定义的运算法则下(它也有加法与乘法)的计算结果也永远在这255个元素以内,比如:

伽罗华域GF(28)GF(2^8)内的元素为:{1,2,4……,142}\{1,2,4……,142\}

其中:

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

伽罗华域的上述性质让它在密码计算领域非常受重视,而且得到非常广泛的应用。同样,QR码也利用了伽罗华域的这个性质,不错!RS的计算其实就是密码计算!

为了计算RS纠错码,通常的资料上都说,使用数据码多项式对生成多项式求余,得到的余数多项式就是纠错码,而这里所涉及的所有多项式计算,都是在伽罗华域GF28GF2^8上进行的。

因此,计算RS码的第一步就是求出GF28GF2^8的所有元素来。这一步我是利用Excel工作表函数实现的,这样同样比较可视化

从QR Specification(GB18284-2000)中我们知道,用于计算QR码的多项式是在以多项式:

x8+x4+x3+x2+1=0

x^8+x^4+x^3+x^2+1=0

为模的伽罗华域GF(28)GF(2^8)上生成的。怎么理解呢?简单说来,我们首先知道GF(28)GF(2^8)共有255个元素,而且这些元素全部都可以写成一个元素aa的幂次的形式,元素aa是一个假想出来的元素,称为伽罗华域的本原元素,简称“本原元”,而所有的元素都是aa的幂次形式,具体来说,GF(28)GF(2^8)的元素包括:

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

a^0 , a^1, a^2, ..., a^{254} ,

这所有的元素如果写成二进制,则刚好可以表示成多项式的形式,多项式的每一项的指数数表示二进制数的位数,而多项式的系数(1或0)则表示该位上的数字,如下面的多项式

x8+x4+x3+x2+1=0

x^8+x^4+x^3+x^2+1=0
表示的数字就为:

100011101

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

a^0 = 1

a1=a

a^1 = a

a2=a2

a^2 = a^2

...

...

a8=a8=a4+a3+a2+1

a^8 = a^8 = a^4+a^3+a^2+1
上式是因为 a8+a4+a3+a2+1=0a^8+a^4+a^3+a^2+1=0,根据异或运算的规则,有 a8=a4+a3+a2+1a^8=a^4+a^3+a^2+1,接下来还可以继续计算 a9a^9:

a9=a8∗a=a5+a4+a3+a

a^9 = a^8 *a =a^5+a^4+a^3+a

...

...

a12=a8+a7+a6+a4=a4+a3+a2+1+a7+a6+a4=a7+a6+a3+a2+1

a^{12} = a^8+a^7+a^6+a^4 = a^4+a^3+a^2+1+a^7+a^6+a^4=a^7+a^6+a^3+a^2+1
注意到了么,上面式子里 a4a^4项出现两次,因此根据异或运算法则相消了。按照上面的式子以此类推就可以计算出所有 GF(28)GF(2^8)中的元素,而且可以验算,从 a255a^{255}开始,结果就开始重复了。这些元素的多项式按照前面所述的规则表示为二进制数,就是 GF(28)GF(2^8)中元素的值了。如:

a12=a7+a6+a3+a2+1

a^{12} = a^7+a^6+a^3+a^2+1

−>

->

(11001101)2=(205)10

(11001101)_2 = (205)_{10}

255个元素当然不可能全手工计算,在Excel中,我使用了下面的工作表函数来计算出所有的元素值:

具体的工作表函数很简单,我就不一一列出了,这样可以很快计算出GF(28)GF(2^8)的所有元素:

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

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

到这里,我们已经计算出了伽罗华域的所有元素,在下篇文章中,我们将探讨RS纠错码的计算,生成多项式的计算等内容

基于Excel的QR二维码生成工具——原理及算法详解(之一)相关推荐

  1. canvas 插件_基于canvas的JavaScript 二维码生成工具——QRCanvas

    介绍 在我们日常的开发中,特别是在现代的社会环境下,二维码的应用可谓是丰富多彩,各种各样让人眼花缭乱的二维码,可见二维码已经渗透进我们生活的方方面面,也可以说目二维码确确实实方便了我们的生活.因为作为 ...

  2. Qt开发二维码工具QR二维码生成和识别支持批量生成免费使用

    简介 Qt编写,使用第三方库libqrencode和QZxing,支持QR二维码生成和识别,二维码可批量生成,支持中文,还可以设置二维码大小颜色.免费使用,下载链接在本文底部,拿走不用谢,假如您慷慨大 ...

  3. 二维码 生成工具类(文件转Base64字符串,Base64字符串转文件)

    希望我的知识榨干了能帮到你解除困难,要是没有帮助你的,问度娘和知爹 一.POM.xml依赖下载 二.工具类提供 一.POM.xml依赖下载 <!-- 生成二维码依赖 --><depe ...

  4. 支付宝支付 第五集:二维码生成工具

    支付宝支付 第五集:二维码生成工具 一.代码 目录结构 BufferedImageLuminanceSource.java package com.dzy.alipay.qrcode;import c ...

  5. 二维码生成工具微信小程序源码下载

    二维码生成工具 支持上传二维码logo和调整尺寸背景颜色等等 无需域名与服务器 使用教程,用HBuilder X软件打卡项目然后运行到微信小程序即可 下方是演示图: 小程序源码下载地址: (已更新)二 ...

  6. 软件推荐——二维码生成工具(绿色版)

    Simple Code Generator 二维码生成工具 软件介绍: Simple Code Generator是一款适用于Windows的简单工具,它允许您快速生成二维码,以便在智能手机上使用应用 ...

  7. QT-C++二维码生成工具(支持中文等任何字符的使用)

    QT-C++二维码生成工具 前言 1.效果预览 1.核心程序 全部程序 前言 QT/C++生成二维码程序,支持二维码图片本地保存功能. 1.效果预览 1.核心程序 如下: // 生成二维码图片QStr ...

  8. Python的妙用,PyQt5+qrcode,Python制作二维码生成工具

    前言: 今天我们就利用PyQt5+qrcode制作一个简单的二维码生成工具吧.让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: PyQt5模块: qrcode模块: 以及一些P ...

  9. 二维码生成工具V1.0

    二维码生成工具V1.0 (安装 Microsoft .NET Framework 4.5) 功能一.基础配置是用来完成中间带Logo图标的配置功能,生成操作中,如果是要带图标时,必需上传: 功能二.单 ...

最新文章

  1. win10 动态磁盘 linux,win10系统动态磁盘改为基本磁盘的方法
  2. 生成条形码、印章、邮件地址(玩玩)
  3. 通过追源码解决:xmlrpc.client设定请求超时时间
  4. java 修改ip_如何用脚本快速修改IP地址(Netsh)
  5. Bourbon: 让你的sass更简洁
  6. 【pytorch】torch.linspace==>返回一个一维的tensor(张量),这个张量包含了从start到end,分成steps个线段得到的向量
  7. Kubernetes Ingress入门指南和实践练习
  8. mysqldump备份所有数据库,恢复单个库的场景预演
  9. python list array_Python列表list 数组array常用操作集锦【转】
  10. 实现fashion_minst服装图像分类
  11. log4cpp 概述与基本使用实例(一)
  12. java 中英文长度_Java 计算中英文长度的若干种方法
  13. built a JNCIS LAB系列:Chapter 1 Communities v1.0
  14. mysql 分区表如何恢复_如何恢复mysql 单个innodb 分区表
  15. 各种音频线的阻抗(数字音频线,模拟音频线,麦克音频线,拖拽音频线)
  16. 微信小程序两种跳转页面的方法
  17. DDR、DDR2、DDR3、DDR4、LPDDR区别
  18. MARCHdesign_王濤's 星云个人网站 | www.xingyun.cn/MARCHdesign
  19. java Arrarlist中的add(int index,Object ojb)
  20. 长三角如何成为人才净流入最高的城市群?

热门文章

  1. ubuntu下安装vsftpd及vsftpd配置文件不见的解决办法
  2. 新形势下的工业MRO电商平台该何去何从?
  3. 服务器配置磁盘阵列和安装centos7.6操作系统
  4. 张量基础学习(一 概念,求和指标,符号)
  5. 关于CCD定位的方法总结
  6. raid5 合适 多少块硬盘_RAID5需要几块硬盘
  7. jdbc驱动的配置位置
  8. java校园管理,JAVA校园网络管理系统
  9. YUI 3 Cookbook
  10. SQL语句--跨数据库实例联查