用于QR码生成器的Reed-Solomon算法
Reed-Solomon algorithm for a QR code generator
在我的数据结构类中,我想为我的最终项目创建一个二维码生成器。然而,我在理解它的"格式化纠错"部分时遇到了一些困难。我想使用11(L)的纠错和100(每隔一行)的掩码模式。由于我是一名本科生,我想尝试保持处理版本1二维码和使用字节编码的简单性。
然后我不明白如何在数据输出后想出纠错框。
查看一些规范,纠错级别L(低,可以纠正7%)被确定为两位模式01,而不是11。链接到二维码格式字符串,其中包括掩码和纠错级别。
http://www.thonky.com/qr-code-tutorial/format-version-information
由于你已经选择了一个特定的纠错级别和掩码模式,这与thonky.com网页中使用的相同,格式字符串将是一个固定的15位模式:"纠错级别为L、掩码模式为4的代码的最终格式字符串是110011000101011",所以你不必麻烦计算它。
对于QR码,8位字段GF(2^8)基于9位多项式
x^8 + x^4 + x^3 + x^2 + 1 = hex 11d
the primitive α = x + 0 = hex 2
请注意,二进制字段的加法和减法都与xor相同。
QR码版本1是一个21乘21位=441位的矩阵,表示为黑色或白色正方形,208位==26字节用于数据和ecc。
具有纠错级别L的QR码具有152位==19字节的数据和56位==7字节的ecc,4位用于校正,3位用于检测。用于校正的4个字节可以校正26个字节中的2个,约为26个数据字节的7%。除了用于检测的3个字节之外,如果在解码期间,计算的位置中的任何一个都在26个字节的数据的范围之外,则也检测到不可校正的错误。
生成多项式g(x)是产生7项余数的8项多项式。g(x)=0的7个根是α的连续幂,在这种情况下是α^0,α^1。。。α^6==十六进制01、02、04、08、10、20、40。
g(x) = (x-1)(x-α)(x-α^2)(x-α^3)(x-α^4)(x-α^5)(x-α^6)
由于加法==减法==xor,减号可以用加号代替:
g(x) = (x+1)(x+α)(x+α^2)(x+α^3)(x+α^4)(x+α^5)(x+α^6)
g(x) = (x+01)(x+02)(x+04)(x+08)(x+10)(x+20)(x+40)
g(x) = 01 x^7 + 7f x^6 + 7a x^5 + 9a x^4 + a4 x^3 + 0b x^2 + 44 x + 75
将19个字节的数据视为多项式m(x)(m代表消息)。通过乘以x^7,用7个零字节填充19个字节的数据。然后,26字节的多项式除以生成器多项式,余数被"减去"(xor’ed或由于填充产生零,余数仅替换填充的字节)到填充数据的低7字节。调用余数r(x),编码结果c(x):
r(x) = (m(x) x^7) % g(x)
c(x) = (m(x) x^7) - r(x)
再次注意减法是xor,与加法相同。
维基有一篇关于里德所罗门的文章:
http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction
美国国家航空航天局有一个教程:
http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19900019023.pdf
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- OMNeT++ cPacket as std::bitset 以应用 Reed-Solomon 编码
- 用于QR码生成器的Reed-Solomon算法
- 如何使用ezpwd reed-solomon纠错库