二维码-纠错码生成(js)

概要

本文主要为计算,而非对伽罗瓦域等数学内容的深入解析,在知道消息多项式以及纠错数量的情况下通过程序生成对应的纠错码。详细的二维码生成原理参考一个详细全面的二维码生成解析

效果

数据码:
长度16的示例数据码(正常获取的是示例的逆序,为了方便计算,这里颠倒了顺序)

[17, 236, 17, 236, 17, 236, 64, 67, 77, 220, 114, 209, 120, 11, 91,32]

生成多项式:
纠错10个数据码的生成表达式,生成表达式的javascript 实现在上一篇,当然也可以查表获取。

α0x10+α251x9+α67x8+α46x7+α61x6+α118x5+α70x4+α64x3+α94x2+α32x1+α45x0α^{0}x^{10}+α^{251}x^{9}+α^{67}x^{8}+α^{46}x^{7}+α^{61}x^{6}+α^{118}x^{5}+α^{70}x^{4}+α^{64}x^{3}+α^{94}x^{2}+α^{32}x^{1}+α^{45}x^{0} α0x10+α251x9+α67x8+α46x7+α61x6+α118x5+α70x4+α64x3+α94x2+α32x1+α45x0

生成的纠错码(结果)

[196, 35, 39, 119, 235, 215, 231, 226, 93, 23]

思路

使用key-value 的形式表示一个多项式的各项以及各项的阶数和其系数。消息多项式和生成多项式的变量指向有所不同;

消息多项式首项(如 32x15)
key 代表 15 value 代表 32

生成多项式首项(如 α0x10)
key 代表 0 value 代表 10

一个完整的消息多项式
32x15+91x14+11x13+120x12+209x11+114x10+220x9+77x8+67x77+64x6+236x5+17x4+236x3+17x2+236x1+17x032x^{15}+ 91x^{14}+11x^{13}+ 120x^{12}+ 209x^{11}+ 114x^{10}+ 220x^{9}+77x^{8}+ 67x^{77}+ 64x^{6}+ 236x^{5}+ 17x^{4}+ 236x^{3}+ 17x^{2}+ 236x^{1}+ 17x^{0} 32x15+91x14+11x13+120x12+209x11+114x10+220x9+77x8+67x77+64x6+236x5+17x4+236x3+17x2+236x1+17x0
对应数据结构

{15: 32, 14: 91, 13: 11, 12: 120, 11: 209,10: 114, 9: 220, 8: 77,7: 67, 6: 64, 5: 236, 4: 17, 3: 236, 2: 17, 1: 236, 0: 17
}

一个完整的生成多项式
α0x10+α251x9+α67x8+α46x7+α61x6+α118x5+α70x4+α64x3+α94x2+α32x1+α45x0α^{0}x^{10}+α^{251}x^{9}+α^{67}x^{8}+α^{46}x^{7}+α^{61}x^{6}+α^{118}x^{5}+α^{70}x^{4}+α^{64}x^{3}+α^{94}x^{2}+α^{32}x^{1}+α^{45}x^{0} α0x10+α251x9+α67x8+α46x7+α61x6+α118x5+α70x4+α64x3+α94x2+α32x1+α45x0
对应数据结构

{
10: 0, 9: 251, 8: 67, 7: 46, 6: 61, 5: 118, 4: 70, 3: 64, 2: 94, 1: 32, 0: 45
}

代码

//对数反对数表 (来源 qrcode.js)
let QRMath = {glog: function (n) {if (n < 1) {throw new Error("glog(" + n + ")");}return QRMath.LOG_TABLE[n];},gexp: function (n) {while (n < 0) {n += 255;}while (n >= 256) {n -= 255;}return QRMath.EXP_TABLE[n];},EXP_TABLE: new Array(256),//  真数LOG_TABLE: new Array(256)// 指数
};
for (let i = 0; i < 8; i++) {QRMath.EXP_TABLE[i] = 1 << i;// 1 2 4 8  16 32 64 128
}
for (let i = 8; i < 256; i++) {QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];//8:  16 ^ 8 ^ 4 ^ 1  29//9: 32 ^ 16 ^ 8 ^ 2  58
}
for (let i = 0; i < 255; i++) {QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
}//数据码字(消息多项式的系数)
let _msg_coefficients = [17, 236, 17, 236, 17, 236, 64, 67, 77, 220, 114, 209, 120, 11, 91, 32];
//生成多项式 α 表达式指数
let _generator_coefficients = [45, 32, 94, 64, 70, 118, 61, 46, 67, 251, 0];/*** 根据数据码字生成纠错指定数量的纠错码* @param msg_coefficients  数据码字十进制数组* @param generator_coefficients 生成多项式 各项α表达式指数数字组*/
function rs(msg_coefficients, generator_coefficients) {//格式化消息多项式 、生成多项式let msgPolynomial = {};let generatorPolynomial = {};msg_coefficients.forEach((d, i) => msgPolynomial[i] = d);generator_coefficients.forEach((d, i) => generatorPolynomial[i] = d);let msg_num = msg_coefficients.length;let generator_num = generator_coefficients.length - 1;//纠错数量 纠错数量比生成表达式项数少一// a 表示消息多项式 msgPolynomial  b 表示生成多项式 generatorPolynomiallet curr_a = {};let curr_b = {};// msg 升幂Object.keys(msgPolynomial).forEach(d => {curr_a[+d + generator_num] = msgPolynomial[d]});// generator 升幂Object.keys(generatorPolynomial).forEach(d => {curr_b[+d + msg_num - 1] = generatorPolynomial[d]});for (let i = 0; i < msg_num; i++) {//各项阶数的降序排列let a_keys = Object.keys(curr_a).map(d => +d).sort((m, n) => n - m);let b_keys = Object.keys(curr_b).map(d => +d).sort((m, n) => n - m);/** 1)* generator 乘以msg最高项系数,* 因为 msg的项系数为真数 generator的项系数为指数表达式* 因此 将msg的项系数为真数最高项的系数转成alpha 表达式,然后再乘到generator上*/let a_item_0 = QRMath.glog(curr_a[a_keys[0]]);b_keys.forEach(k => {curr_b[k] = (curr_b[k] + a_item_0) % 255;});/**2)* 2-1)a XOR b  (系数XOR)将结果的首项去除(首项系数为0) 作为新的消息多项式a,* 2-2)b降幂一次作为新的生成多项式,之前的升幂操作就避免* 最低阶项降幂失败,因为升幂消息码字数量,同样的需要进行消息码字数量次 异或,也就是降幂的次数等于异或的次数。*/let xor_result = {};let xor_start = Math.min(a_keys[a_keys.length - 1], b_keys[b_keys.length - 1]);// 起始阶数let xor_end = Math.min(a_keys[0], b_keys[0]);//终止 阶数let a_t, b_t;for (let j = xor_start; j <= xor_end; j++) {if (xor_result[j] == null) {//异或操作时没有对应阶数的项,取本身a_t = curr_a[j] != null ? curr_a[j] : 0;b_t = curr_b[j] != null ? QRMath.gexp(curr_b[j]) : 0;xor_result[j] = a_t ^ b_t}}if (xor_result[xor_end] == 0) {delete xor_result[xor_end];//异或结果移除系数为零首项}//新的acurr_a = xor_result;//降幂获得新 bcurr_b = {};Object.keys(generatorPolynomial).forEach(d => {curr_b[+d + msg_num - 1 - i - 1] = generatorPolynomial[d]});}//异或结果let result_desc = Object.keys(curr_a).sort((a, b) => +b - +a).map(k => curr_a[k]);console.log('数据码字:', msg_coefficients);console.log('纠错码字:', result_desc);console.log('纠错7纠错码字:', [196, 35, 39, 119, 235, 215, 231, 226, 93, 23])
}rs(_msg_coefficients, _generator_coefficients, 16, 10);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步一步学python爬虫_初学Python之爬虫的简单入门

初学Python之爬虫的简单入门一、什么是爬虫&#xff1f;1.简单介绍爬虫爬虫的全称为网络爬虫&#xff0c;简称爬虫&#xff0c;别名有网络机器人&#xff0c;网络蜘蛛等等。网络爬虫是一种自动获取网页内容的程序&#xff0c;为搜索引擎提供了重要的数据支撑。搜索引擎通过网络…

实现二维码-完整三种编码流程加代码解析(javascript)

效果 输入内容&#xff1a;XXXwedewed生日//&sss乐❤XXXwedewed生日//&sss乐❤ 完整的演示效果为&#xff0c;输入内容后会将解码绘制的每一步都展示&#xff08;有点长就不全截图了&#xff0c;可以直接移至最后复制代码到本地运行&#xff09;&#xff1a; 原理…

可视化排班管理_小白经理的思考日记-可视化看板和走动管理

前言&#xff1a;所谓勤于思&#xff0c;敏于行&#xff0c;实践能提升思考的深度&#xff0c;反思也能更好的指导实践。基于这样的认知&#xff0c;我将过往所学所思所行进行了专题整理&#xff0c;对内化知识和技能结构颇有益。又承蒙付老师抬爱和鼓励&#xff0c;推荐我看《…

headerIP php_PHP curl伪造IP地址和header信息代码实例

原标题&#xff1a;PHP curl伪造IP地址和header信息代码实例curl虽然功能强大&#xff0c;但是只能伪造$_SERVER["HTTP_X_FORWARDED_FOR"]&#xff0c;对于大多数IP地址检测程序来说&#xff0c;$_SERVER["REMOTE_ADDR"]很难被伪造&#xff1a;首先是clien…

c++ 使用nacos_为什么选用Nacos?虎牙直播微服务改造实践

原标题&#xff1a;为什么选用Nacos&#xff1f;虎牙直播微服务改造实践“相比文字和图片&#xff0c;直播提供了人与人之间更丰富的沟通形式&#xff0c;其对平台稳定性的考验很大&#xff0c;那么倡导“以技术驱动娱乐”的虎牙直播如何在技术上赋能娱乐&#xff1f;本文将分为…

three.js 拖动场景中物体(原生|拖拽控制器)

非控制器版 拖动场景中的物体实际上是在一个平行于窗口的平面中进行拖动&#xff0c;确定这个平面并确定鼠标在该平面中的位置变化&#xff0c;就将问题转换成简单的2d移动物体了 <!DOCTYPE html> <html> <head><meta charsetutf-8><title>015-…

bch纠错码 码长8_从HDMI视频数据带有BCH纠错码讨论线材对画质的影响

一直感觉几十元的HDMI线已经可以正常传输视频信号,那么几百元应该是接近完美了,再听人说换上几千块的线就让画质黑位什么的提升一大截,认为非常不可思议.但别人又信誓旦旦的说自己是感觉到了明显改变,对这种情况产生的争论最终不会得到正确答案,所以数据党还是从科学的角度先分…

element-ui 可复选树型表格

效果 思路 自定义模板当点击某个行复选框时&#xff0c;其所有后代复选框都要同步状态&#xff0c;且其直系父辈状态需要根据所点击复选框的状态来修正点击全选复选框时&#xff0c;批量同步所有行内复选框状态 代码 非封装组件&#xff0c;按需自行改写 确保引入element-ui…

linux 删除含有关键词的文件_linux下查找包含关键字的文件

在linux下如果要查找包含某个关键字的文件&#xff0c;如要在nagios目录下搜索带有关键字“store-rd-sys”的文件&#xff0c;在终端下运行命令&#xff1a;/usr/local/nagios/etc/* (nagios目录)法1&#xff1a;grep -r “关键字” 路径[rootnagios01 ~]#grep -r "store-…

树形可拖拽排序配置组件

效果 使用场景 vue2下自定义表格表头配置: 列排序&#xff0c;显示/隐藏等。确保表头以配置项的形式加载&#xff0c;这样表格才能对修改后的配置作响应 思路 1、表格使用render函数加载(如有疑问可私信)&#xff0c;通过类似如下的columns配置表头 columns: [{ label: 姓名…

maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题

我们项目中使用到第三方的库文件&#xff0c;这些jar库文件并没有放到Maven中央库上&#xff0c;导致我们需要在项目中自己配置使用。我们的两三个开发人员对Java都是很熟&#xff0c;因此在使用中遇到了一些问题&#xff0c;表现在&#xff1a;在本地中引入第三方jar包后&…

自适应浮动表单填充布局脚本

效果 1、适合搜素表单布局&#xff0c;查询重置等功能块始终位于最后一行的最后一列 2、适合普通多行两端对齐&#xff0c;未填充满的行左对齐 思路 此脚本目的为实现整齐风格的表单布局&#xff0c;为了达到整齐的效果&#xff0c;每个表单元素或者块都要设置一致的 宽度…

rstudio导入txt文件_R语言 | 读写txt、csv、excel文件

前段时间看到plotnine库(封装的R语言ggplot2)作的图太美了&#xff0c;有点想重新拾起R语言^_^R语言代码略带凌乱&#xff0c;讲真的还是更喜欢Python代码简洁。不过好几年不琢磨R语言&#xff0c;对R语言代码的凌乱美有些新奇&#xff0c;很好玩&#xff0c;这也许就是久别胜新…

erp采购总监个人总结_erp采购总监总结.docx

erp采购总监总结ERP沙盘模拟心得体会——采购总监  刚开始接触ERP&#xff0c;就从学长们那里了解到这门课比较有意思&#xff0c;然后又听老师说我们还有一个为期两周的ERP沙盘模拟&#xff0c;这让我对这门课更有了极大的兴趣。一直期待着沙盘模拟对抗早点到来&#xff0c;…

矩阵字符串配置任意合并表格布局

效果 核心 布局配置矩阵&#xff08;以下为多个模式),可以使用|或\n表示矩阵行 const gridArr [1,2,a,b 3,4,a,b 5,6,a,b ,1,2 3,4 5,6 ,1,2,3,4 3,4]任意横向或者纵向相同的字符表示一个合并块 使用 <CalcTable grid"1,2,a,b|3,4,a,b|5,6,a,b" ><span…

django 套vue 模板_Vue admin template + Django 快速进行Web开发

本文教大家如何使用Vue admin template和Django快速进行Web开发&#xff0c;旨在帮助我们使用现有的工具、框架及开源UI&#xff0c;让我们在基础较为薄弱的情况下&#xff0c;能进行Web开发。本文不会介绍过多的原理&#xff0c;实践为主。Vue admin template的简单使用Vue ad…

js浮点运算式

结果 calc(0.23*-0.03(4*0.2)) >0.7931 代码 //加|减|乘|除 浮点运算 const floatMulti (a, b) > {let m 0, s1 a.toString(), s2 b.toString(), s1l s1.split(.)[1], s2l s2.split(.)[1]m (s1l ? s1l.length : 0) (s2l ? s2l.length : 0)return Number(s1…

悬浮球多功能_一个悬浮球,怎么可以这么贴心~

原标题&#xff1a;一个悬浮球&#xff0c;怎么可以这么贴心~一个悬浮球 满足你N个愿望※ 专题&#xff5c;图文&#xff5c;悬浮球上手指南这个小蛋蛋是不少小朋友喜爱的零食&#xff0c;因为它能满足小朋友好几个愿望&#xff0c;能吃又能玩的零食哪个小朋友会不喜欢&#xf…

python 字典添加元素乱序了_Python有序字典的两个小“惊喜”

从 Python 3.6 开始&#xff0c;常规的字典会记住其插入的顺序&#xff1a;就是说&#xff0c;当遍历字典时&#xff0c;你获得字典中元素的顺序跟它们插入时的顺序相同。在 3.6 之前&#xff0c;字典是无序的&#xff1a;遍历顺序是随机的。关于有序字典&#xff0c;这里有两件…