精华内容
下载资源
问答
  • 生成原理

    2018-11-15 22:02:29
    HM-024 生成树和快速生成原理。了解STP协议产生的背景 掌握STP工作原理 掌握RSTP工作原理 熟练运用华为STP协议命令
  • 二维码生成原理

    热门讨论 2013-09-18 10:07:04
    本文档主要介绍二维码生成原理方法,图文并茂。
  • 易语言伪随机数生成原理.rar 易语言伪随机数生成原理.rar 易语言伪随机数生成原理.rar 易语言伪随机数生成原理.rar 易语言伪随机数生成原理.rar 易语言伪随机数生成原理.rar
  • 易语言伪随机数生成原理源码,伪随机数生成原理,取随机数_
  • 易语言源码伪随机数生成原理.rar 易语言源码伪随机数生成原理.rar 易语言源码伪随机数生成原理.rar 易语言源码伪随机数生成原理.rar 易语言源码伪随机数生成原理.rar 易语言源码伪随机数生成原理.rar
  • Quartus生成原理

    千次阅读 2020-11-25 22:42:56
    Quartus生成原理图 在我们的工程创建完毕后,即vhd代码编写并保存完毕后,通过File→Create/Update→Create Symbol Files for Current File即可生成原理图。 生成成功的话会提示: 生成成功后,在工程的目录下,...

    Quartus生成原理图


    在我们的工程创建完毕后,即vhd代码编写并保存完毕后,通过File→Create/Update→Create Symbol Files for Current File即可生成原理图。

    在这里插入图片描述
    生成成功的话会提示:
    在这里插入图片描述
    生成成功后,在工程的目录下,我们可以找到 实体名.bsf 文件,用Quartus打开即可查看。大概是长这个亚子的:
    在这里插入图片描述

    展开全文
  • 比特币原理详解

    万次阅读 多人点赞 2019-10-29 11:12:13
    一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本...其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...

    一、什么是比特币

    比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。

    二、问题引入

     假设现有4个人分别称之为ABCD,他们之间发起了3个交易,A转给B10个比特币,B转给C5个比特币,C转给D2个比特币。如果是传统的记账方式,这些交易会记录在银行的系统中,这些信息由银行来记录,我们相信银行不会随意添加、删除或修改一条交易记录,我们也不会关注到底有哪些交易,我们只关注自己的账户余额。而比特币的记账方式为ABCD每个人保存了这样一份账本,账本上记录了上述交易内容,如果每个人账本实时的一致,ABCD就不再需要银行。
            比特币是这样做的,每当有人发起一笔交易,他就要将一笔交易广播至全网,由全网中的某一个人,把一段时间内的交易打包好记录到一个区块上,再按照顺序把这些区块,一个一个的链接在一起,进而形成了一个链条,这就是所谓的区块链。

     

    那么问题来了

    1、我凭什么要参与这个系统,我为什么要动用自己的计算机资源来存储这些信息呢?

    2、以谁的记录为准呢?比如上面的账单顺序,A用户可能是这个顺序,但是B可能顺序不一样,甚至可能B根本就没有接收到C给D转账的这个消息。

    3、比特币如果做到支付功能,保证该是谁的钱就是谁的钱,而且只有其所有者才能花。

    4、如何防伪、防篡改以及双重支付,防伪是验证每条交易的真的是某人发出的,比如B可能杜撰一条消息,说某某给我转了一笔钱,这就是一个假消息,或者B说我给某人转了多少钱,但是实际上他并没有这么多钱,又怎么办。防篡改指的是B可能想从区块链上把自己曾经转给某人钱的记录删掉,这样他的余额就会增加。双重支付是指,B只有10比特币,他同时向C和D转10个比特币,造成双重花费。

    三、为什么要记账?

    因为记账有奖励,记账有手续费的收益,而且打包区块的人有系统奖励,奖励方案是,每十分钟生成一个区块,每生成一个区块会奖励一定数量的比特币,最开始是50个BTC,过4年会奖励25个BTC,再过4年再减少一半,以此类推。这样比特币的产生会越来越少,越来越趋近于一个最大值,计算公式是:50×6×24×365×4×(1+1/2+1/4+1/8+…)≈2100万,其中最初奖励50个比特币,每小时有6个区块,每天24小时,每年365天,前四年是如此,之后每四年减半。

    此外,记账奖励还有每笔交易的小额手续费,每个交易发起都会附带一定的手续费,这些手续费是给记账的矿工的。

    四、以谁为准?

    各个节点通过工作量证明机制来争夺记账权,他们计算一个很复杂的数学题,第一个计算出来的节点就是下一个区块的产生者。这个数学题很难,难到没有一个人能同过脑子算出来,它是基于概率的方法,矿工必须通过遍历、猜测和尝试的办法才能解开这个未知数。那么这个数学难题到底是什么呢?下面详细介绍。

    4.1哈希函数

    哈希函数又称为数字摘要或散列函数,它的特点是输入一个字符串,可以生成另外一个字符串,但是如果输入不同,输出的字符串就一定不同,而且通过输出的字符串,不能反推出输入。举个简单的例子,对1-100内的数模10,可以认为是一种哈希方法,比如98%10=8,66%10=6,98和66是输入,模10是哈希函数,8和6是输出,在这个模型中,通过6和8无法推断输入是66和98,因为还可能是56和88等,当然因为这个例子比较简单,所以会出现哈希碰撞,即66和56的结果都是6,输出的结果相同。一个优秀的哈希函数,可以做到输出一定不同,哈希碰撞的概率几乎为0。常见的哈希函数有很多,比如MD系列和SHA系列等,比特币采用的SHA256算法,即输入一个字符串,输出一个256位的二进制数。下面是程序运行的结果。

    通过程序结果可以看出,输入的源信息不同,得到的结果也不同(为了方便,结果用64位16进制表示),即使是orange多了一个句号,也会产生截然不同的结果。同时,通过输出的十六进制字符串,也无法倒推出输入。对于比特币,只要了解SHA256的功能即可,如果感兴趣可以深入了解SHA256的具体算法。需要SHA256的C++源码留言邮箱或私信。

    4.2挖矿原理

    首先介绍一下比特币每个区块的数据结构,每个区块由区块头和区块体两部分组成。

    区块体中包含了矿工搜集的若干交易信息,图中假设有8个交易被收录在区块中,所有的交易生成一颗默克尔树,默克尔树是一种数据结构,它将叶子节点两两哈希,生成上一层节点,上层节点再哈希,生成上一层,直到最后生成一个树根,称之为默克尔树根,只有树根保留在区块头中,这样可以节省区块头的空间,也便于交易的验证。

    区块头中包含父区块的哈希,版本号,当前时间戳,难度值,随机数和上面提到的默克尔树根。

     

     

    假设区块链已经链接到了某个块,有ABCD四个节点已经搜集了前十分钟内全网中的一些交易信息,他们选出其中约4k条交易,打包好,生成默克尔树根,将区块头中的信息,即发区块哈希+版本号+时间戳+难度值+随机数+默克尔树根组成一个字符串str,通过两次哈希函数得出一个256的二进制数,即SHA256(SHA256(str)) = 10010011……共256位,比特币要求,生成的结果,前n位必须是0,n就是难度值,如果现在生成的二进制数不符合要求,就必须改变随机数的值,重新计算,只到算出满足条件的结果为止。假设现在n是5,则生成的二进制数必须是00000……(共256位)。一旦挖矿成功,矿工就可以广播这个消息到全网,其他的矿工就会基于该区块继续挖矿。下一个区块头中的父区块哈希值就是上一个区块生成的00000……这个数。

    解决这个数学难题要靠运气,理论上,运气最好的矿工可能1次哈希就能算出结果,运气差的可能永远都算不出来。但是总体来看,如果一个矿工的算力越大,单位时间内进行的哈希次数就越多,就越可能在短时间内挖矿成功。

    那么n是如何确定的呢?比特币设计者希望,总体上平均每十分钟产生一个区块,总体上来看,挖矿成功的概率为1/2^n。现假设世界上有1W台矿机,每台矿机的算力是14T次/s = 1.4×10^13次/s,单位次/s称之为哈希率,10分钟是600s,所以10分钟可以做8×10^19次哈希运算,从概率角度看,想要挖矿成功需要做2^n次运算,可以列出等式2^n = 8×10^19,可以解出n约为66。所以对于这种方法,我们没有办法使得自己的运气变的更好,只能提高自己的算力,尽快的算出结果。

    另外,需要模拟挖矿过程的C++代码可以回复邮箱,代码可以通过调整难度值,模拟比特币的挖矿算法,控制区块产生的速度。

    五、如何防伪、防篡改、防双重支付等问题

    这部分是理解比特币很重要的部分。

    5.1电子签名技术

    身份认证技术在生活中很常见,可以是人脸识别、签字、指纹等,但是这些方法在数字货币领域并不安全,因为它们一旦数字化,都可以通过复制的方法伪造。所以比特币采用了电子签名的方法。

    注册成为比特币用户时,系统会根据随机数生成一个私钥,私钥会生成一个公钥,公钥又会生成一个地址,其中私钥必须保密,可以保存到硬盘里或者记到脑子里,因为这个私钥是使用相应地址上的比特币的唯一标识,一旦丢失,所有的比特币将无法使用。下面介绍具体的转换过程,不感兴趣可以不看,只要知道随机数->私钥->公钥->钱包地址这个过程,其中私钥可以对一串字符进行加密,而公钥可以对其进行解密,这就是非对称加密,这类算法总体上的功能都是一样的,只是具体算法有区别,由于这些算法比较复杂,与SHA265算法一样不多做介绍,感兴趣可以深入了解具体算法,但是对于比特币系统,只要了解其功能即可。典型的算法是RSA,比特币采用椭圆曲线加密算法。

    转换过程(选读,不影响理解)

        1、首先使用随机数发生器生成一个私钥,它是一个256位的二进制数。私钥是不能公开的,相当于银行卡的密码。

        2、私钥经过SECP256K1算法生成公钥,SECP256K1是一种椭圆曲线加密算法,功能和RSA算法类似,通过一个已知的私钥,生成一个公钥,但是通过公钥不能反推出私钥。

        3、同SHA256算法一样,RIPEMD160也是一种HASH算法,由公钥可以得到公钥的哈希值,而通过哈希值无法推出公钥。

        4、将一个字节的版本号连接到公钥哈希头部,然后对其进行两次SHA256运算,将结果的前4字节作为公钥哈希的校验值,连接在其尾部。

        5、将上一步的结果使用BASE58进行编码,就得到了钱包地址(相当于银行账户)。比如A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

    所以,通过以上的过程我们可以总结出私钥、公钥、钱包之间的关系如下图。可以看到通过私钥可以推出所有的值,公钥哈希和钱包地址之间可以通过BASE58和BASE58解码算法相互转化。

    了解了公钥、私钥、地址的概念后,防伪验证的过程就很容易理解,当A发起一笔交易后,对消息进行哈希,生成数字摘要,对数字摘要,通过私钥加密,生成一个密码。之后A会广播这个条交易消息、公钥以及密码。收到消息的人首先对交易信息进行哈希生成摘要1,再通过公钥对密码进行解密,生成摘要2,这样,如果两个摘要相同,说明这个消息确实是A发出的。所谓的签名,就是密文。

     

    5.2余额检查

    余额的概念应该说根深蒂固,余额是伴随着称之为借贷记账法而产生的,也是目前银行普遍采用的方法,将一个人的交易记录统计好后算出一个余额,但是在比特币中没有余额这个概念,因为其采用的是UXTO模型的记账方法。比如A->B10个比特币,B->C5个比特币,对于第二笔交易来说,B在发起这笔交易时要注明第一笔交易的信息,这样就可以知道B曾经从A那里收到过10个比特币,说明满足第二笔交易发起的条件。所以比特币中余额的检查是通过追溯的方法。

    上图描述了两笔交易,交易10001中,B向C转了10个比特币,验证这笔交易的过程是:首先将B的签名通过B的公钥解密,然后再和交易的具体内容(B签名左侧)对比,如果相同,说明消息是B发出的,然后再检查10000这个交易是否真的存在以及它的内容的真实性。这两点都满足了,就说明交易10001是可以被接受的,否则拒绝接受。

    实际上,真实的交易比这个复杂的多,因为有可能是多笔交易构成了输入,比如B->C20个比特币,是由多笔交易A->B10,D->B10构成的,则前一笔交易ID就是两个ID,甚至可能更多。这里为了简单描述,只列举一笔交易。

    5.3双重支付

    A同时发了两条消息,同时给B和C转了10个比特币,实际上他只有10个会怎么样?假设D节点先收到了转给B10个BTC,然后收到了转给C10个比特币,通过上面的验证方法,自然会拒绝后面的一个,与此同时,E节点可能先收到了转给C10个BTC,然后收到了转给B10个比特币,他自然会拒绝后者。至于哪一笔交易最终会上链,就要看D和E哪个先解决难题,成功挖矿。

    5.4防止篡改

    假设A转给B10个比特币,但是他想把这个信息从区块链上删除,这样大家就都不知道这个事情存在,就可以赖账。
            首先说一下最长链原则,假设某一个区块后面有两个矿工同时挖到了矿,或者由于网络延迟等原因产生了分歧,这时,各个节点先随意根据自己认为对的区块挖矿,只到下一个区块产生,这时会有两条链,但是有一条是长的,比特币规定,以最长的链为准。如果某个节点仍然的固执的以较短的链为准,他就是在和大多数算力作对,这样做的结果是,他挖的块不被大家认可,会浪费时间和算力。

    回到上面的场景,A想赖账,就只能从记录了A->B10个比特币这个消息的区块的前一个区块开始重新挖矿,造出一个支链来,但是实际上的区块已经前进了很多,他只能不停的追赶,而且在追赶的同时,主链也在前进,他必须以比主链快的速度前进,如果他的算力足够大,理论上通过较长的时间确实可以追赶成功,就实现了对交易信息的篡改。然而其实这几乎是不可能的,因为就算算力再大,平均出块速度也是10分钟,从非技术的角度讲,一个人如果掌握了全网一半以上的算力,他为什么不在主链上继续挖矿呢?一个富可敌国的人应该不会甘愿去做一个小偷吧。 

    六、总结

    区块链并不等同于比特币,比特币也不是区块链,区块链只是比特币应用的一种技术,这个技术能给我们带来启发,比特币的伟大之处在于应用了前所未有的区块链技术。区块链技术还能在哪些方面应用还需继续探索。

    比特币是区块链技术最成功的应用,但是比特币本身也有很多问题,它想通过发行货币来挑战主权货币,这个动机有待商榷。此外,由于比特币的匿名性,只需要一个公钥或地址就能进行交易,为黑色产业提供了很好的平台。另外,比特币并不是一个成熟的支付系统,它具有吞吐率低,可拓展性差等缺点。

    可能文字还是比较苍白,可以看看李永乐老师讲解的视频,虽然没有这个详细,但是通俗易懂。

    七、代码实现

    点击这里!

    展开全文
  • 代码生成原理浅析PPT

    2017-04-21 23:42:52
    本文档是无垠式代码生成器研发阶段的理论探讨过程,对理解无垠式代码生成器源码和和平之翼代码生成器这两种动词算子式代码生成器是很重要的。
  • 原理生成步骤

    2015-05-07 19:51:36
    原理图上生成原理号的步骤,步骤详细,大家来看看吧
  • Altium Designer(七)已有原理图生成原理图库 软件:Altium Designer 16 之前的博客中,总结了怎样去创建原理图库,怎样去调用已有的原理图库。本博总结一下怎样根据原理图生成原理图库。 在我们没有原理图库的情况...

    软件:Altium Designer 16
    往期博客:
    AD(一) AD的工程创建
    AD(二)电阻、电容 模型的创建
    AD(三)IC类元件模型创建
    AD(四)排针类元件模型的创建
    AD(五)光耦元件模型的创建
    AD(六)已有元件库的调用
    AD(七)已有原理图生成原理图库
    AD(八)原理图元件放置、复制、图纸放大、连接导线(+调用官方元件库)
    AD(九)原理图Value值核对、网路编号核对、元件名称核对
    AD(十)更改封装、原理图编译及排错(元件编号、网络标签、Net has only one pin、Floating Net Label
    AD(十一)常见CHIP类封装的创建(封装的组成成分、焊盘属性、画焊盘、画丝印、测距)
    AD(十二)常见IC类封装的创建(+元件复制、粘贴、定向移动、阵列粘贴【详细】)
    AD(十三)利用IPC快速创建元件封装
    AD(十四)调用已有的PCB元件封装库
    AD(十五)3D模型的创建和导入
    AD(十六)网表导入及报错解决办法
    AD(十七)PCB板框的评估及层叠设计
    AD(十八)PCB模块化设计+元件布局+布局优化
    AD(十九)class、设计参数、规则的创建
    AD(二十)扇孔与覆铜综合说明、信号走线、电源走线、整体覆铜+快捷键自定义
    AD(二十一)面向加工——PCB的检查和生产输出(光绘、钻孔文件、IPC网表、贴片坐标文件、BOM表)
    AD(二十二)本系列终章—PCB从制图到加工的各类注意事项

    Altium Designer(七)已有原理图生成原理图库

    之前的博客中,总结了怎样去创建原理图库,怎样去调用已有的原理图库。本博总结一下怎样根据原理图生成原理图库。

    在我们没有原理图库的情况下,我们可以和其他人“借”一个原理图(本原理图来自凡亿教育)

    在这里插入图片描述
    1、使用AD打开原理图。此时打开的文件是一个“Free Documents”
    在这里插入图片描述
    在这里插入图片描述
    2、在显示这个文件的情况下,点击【设计】——>【生成原理图库】,中途需要选择一些设置,直接按照默认即可。

    在这里插入图片描述
    3、此时原理图库的文件都是之前打开的原理图文件(.SchDOc)里面的。同时也生成了新的原理图库(.SCHLIB)。这两个文件目前都是“Free Documents”

    在这里插入图片描述

    在这里插入图片描述
    4、将“Free Documents”的原理图库(.SCHLIB)文件的元件模型复制到工程文件的原理图库中。
    具体切换原理图库操作如下:
    ①点击【察看】——>【状态栏】保证状态栏是勾选状态

    在这里插入图片描述
    ②选中“Free Documents”的原理图库(.SCHLIB)文件,点击右下角的【SCH】——>【SCH Library】,进入原理图库

    在这里插入图片描述

    ③ Ctrl+A全选元件模型,或者长按Ctrl 鼠标左键多选元件模型。Ctrl+C选中复制。

    在这里插入图片描述
    ④ 返回工程文件中的原理图库,如果该原理图库已经打开,直接点击即可。

    在这里插入图片描述
    如果未打开,可以点击快捷键,重新进入工程。

    在这里插入图片描述
    选中工程文件中的原理图库(.SCHLIB),重复步骤②进入工程文件的原理图库。

    在这里插入图片描述
    ⑤在【SCH LIBrary 】工作区点击Ctrl +V选择粘贴。此时,刚刚复制的元件模型已经全部粘贴到工程下的原理图库中。

    在这里插入图片描述
    5、值得注意的是,如果粘贴后,元件模型名称与原有模型名称重名,则名称后面会加“_1”、“_2”等字样。

    在这里插入图片描述
    6、复制过来的元件模型的一些属性可能并不一定是我们需要的,所以元件的一些属性还可能需要我们进一步修改。

    展开全文
  • 二维码生成原理及解析代码

    万次阅读 多人点赞 2017-12-18 22:35:06
    二维码生成原理及解析代码 自从大街小巷的小商小贩都开始布满了腾讯爸爸和阿里爸爸的二维码之后,我才感觉到我大天朝共享支付的优越性。最近毕业论文写的差不多了,在入职之前多学一些东西也是好的。这里秉着好奇心...

    二维码生成原理及解析代码

    自从大街小巷的小商小贩都开始布满了腾讯爸爸和阿里爸爸的二维码之后,我才感觉到我大天朝共享支付的优越性。最近毕业论文写的差不多了,在入职之前多学一些东西也是好的。这里秉着好奇心,研究一下二维码的生成,并尝试性写一个二维码解析源码。

    注:暂时只有二维码原理,笔者这段时间会持续研究解析代码,并随进度持续更新。

    参考网址:
    《二维码的生成细节和原理》
    《QR Code Tutorial》
    《Hello World!》—— 知乎专栏文章
    《为程序员写的Reed-Solomon码解释》

    一. 二维码基本知识

    二维码另一个名称是QR Code(Quick Response Code),近年来在移动设备上经常使用,与传统条形码相比,可以存储更多的信息。二维码本质上是个密码算法,基本知识总结如下。
    首先,二维码存在 40 种尺寸,在官方文档中,尺寸又被命名为 Version。尺寸与 Version 存在线性关系:Version 1 是 21×21 的矩阵,Version 2 是 25×25 的矩阵,每增加一个 Version,尺寸都会增加 4,故尺寸 Size 与 Version 的线性关系为:

    Size=(Version1)×4

    Version 的最大值是 40,故尺寸最大值是(40-1)*4+21 = 177,即 177 x 177 的矩阵。

    二维码结构如下图 1.1 所示:



    图1.1 二维码结构

    二维码的各部分都有自己的作用,基本上可被分为定位、功能数据、数据内容三部分。

    • 定位图案:
      • Position Detection Pattern, 定位图案:用于标记二维码矩形的大小;用三个定位图案即可标识并确定一个二维码矩形的位置和方向了;
      • Separators for Position Detection Patterns, 定位图案分割器:用白边框将定位图案与其他区域区分;
      • Timing Patterns, 时序图案:用于定位,二维码如果尺寸过大,扫描时容易畸变,时序图案的作用就是防止扫描时畸变的产生;
      • Alignment Patterns, 对齐图案:只有在 Version 2 及其以上才会需要;
    • 功能数据:
      • Format Information, 格式信息:存在于所有尺寸中,存放格式化数据;
      • Version Information, 版本信息:用于 Version 7 以上,需要预留两块 3×6 的区域存放部分版本信息;
    • 数据内容:剩余部分存储数据内容
      • Data Code, 数据码;
      • Error Correction Code, 纠错码;

    二. 数据编码

    2.1 数据编码信息

    二维码的数据编码信息如下图 2.1, 2.2 中的列表所示:



    图2.1 模式编号指示器



    图2.2 字符计数指示器中的位数

    上图 2.1 中,展示的是二维码支持的数据编码模式。
    :其中中文编码模式为 1101;

    上图 2.2 中展示了不同版本(即不同尺寸)的二维码,单个编码对应二进制的位数。
    :二维码规格说明书中,存在各式各样的编码规范表;

    图2.1, 2.2 表格具体含义,在后面的例程中会具体讲解。

    2.2 数据编码形式

    2.2.1 数字编码(Numeric Mode)

    数字编码的范围为 0~9。
    对于数字编码,统计需要编码数字的个数是否为 3 的倍数:如果不是 3 的倍数,则剩下的 1 位或 2 位会被转为 4bits 或 8bits(十进制转二进制),每三位数字都会被编成 10bits, 12bits, 14bits,具体编码长度仍然需要二维码尺寸决定。

    2.2.2 字符编码(Alphanumeric Mode)

    字符编码的范围有:

    • 数字 0~9;
    • 大写 A~Z(无小写);
    • 几个符号$ % * + - . / 和空格。

    上述字符映射为一个索引表,如下图 2.3 所示:



    图2.3 字符映射索引表

    图中 Char 表示字符,Value 表示字符对应的索引值。
    索引表中共 45 种对应关系,字符编码的过程,就是将每两个字符分为一组,然后转成上图 2.3 的 45 进制,再转为 11bits 的二进制结果。对于落单的一个字符,则转为 6bits 的二进制结果。
    此外,根据上图 2.2 的设定,对不同 Version 的二维码使用 9/11/13 个二进制表示。

    注:
    上图 2.3 中的 SP 代表空格。

    2.2.3 字节编码(Byte Mode)

    可以是 0-255 的 ISO-8859-1 字符。有些二维码的扫描器可以自动检测是否是 UTF-8 的编码。

    2.2.4 日文编码(Kanji Mode)

    日文编码同时也是双字节编码,同样也可以用于中文编码。
    日文与中文编码流程基本相似:

    1. 首先减去一个值;
    2. 挑出差值结果的前两个 16 进制,乘以 0xC0;
    3. 加上后两个 16 进制位;
    4. 转为 13bits 编码;

    按照日文编码集 SHIFT_JIS为参照,可查询日文字符的对应编码。以“雅”与“芒”为例,转换过程如下图 2.4 所示:



    图2.4 日文编码流程展示

    2.2.5 其他编码

    其他类型的编码本文中不详细说明。其中包括:

    • 特殊字符集(Extended Channel Interpretation Mode):主要用于特殊的字符集,并不是所有的扫描器都支持这种编码;
    • 混合编码(Structured Append Mode):说明该二维码中包含了多种编码格式;
    • 特殊行业编码(FNC1 Mode):主要是给一些特殊的工业或行业用的,如GS1条形码等;

    2.3 数据编码示例说明

    分别用一个数字编码与字符编码的示例,说明数据编码的过程:

    2.3.1 例程1:数字编码

    问题:对于 Version 1 尺寸的二维码,纠错级别为 H,编码为:01234567
    解析步骤:

    1. 将上述数字分为三组:012, 345, 67;
    2. 查询图 2.2 表格内容,Version 1 二维码的数字编码应转换为 10bits 的二进制数字,故将上面三组数字转为二进制分别为:012→0000001100, 345→0101011001, 67→1000011;
    3. 将三个二进制串连接起来:0000001100 0101011001 1000011;
    4. 将数字的个数转成二进制:对于数字编码,数字长度依旧用图 2.2 表格中查到的 10bits 二进制数字来表示,数字共有 8 个,故数字个数的二进制形式为:8→0000001000;
    5. 查询图 2.1 表格内容,数字编码的标志为 0001,将编码标志与步骤 4 编码结果加到步骤 3 结果之前,故最终结果为:0001 0000001000 0000001100 0101011001 1000011

    2.3.2 例程2:字符编码

    问题:对于 Version 1 尺寸的二维码,纠错级别为 H,编码为:AE-86
    解析步骤:

    1. 在图 2.3 的字符索引表中分别找到 AE-86 五个字符的索引分别为:(10, 14, 41, 8, 6);
    2. 将五个字符两两分组:(10, 14) (41, 8) (6);
    3. 字符编码应将字符组转换为 11bits 的二进制,故上述三组字符首先转为 45 进制后再转为二进制:
      • (10, 14):转为 45 进制:10×45+14=464;再转为 11bits 的二进制:00111010000;
      • (41, 8):转为 45 进制:41×45+8=1853;再转为 11bits 的二进制:11100111101;
      • (6):转为 45 进制:6;再转为 6bits 的二进制:000110;
    4. 将步骤 3 中得到的三个二进制结果连接起来:00111010000 11100111101 000110;
    5. 查询图 2.2 表格内容,Version 1 二维码的字符个数应转换为 9bits 的二进制数字,对于 5 个字符,二维码字符个数转为 9bits 二进制为:000000101;
    6. 查询图 2.1 表格内容,字符编码的标志为 0010,将编码标志与步骤 5 编码结果加到步骤 4 结果之前,故最终编码结果为:0010 000000101 00111010000 11100111101 000110;

    三. 结束符与补齐符

    对于结束符和补齐符,我们直接举例进行说明。
    问题:对于 Version 1 尺寸的二维码,纠错级别为 H,以笔者的英文名作为编码:CHANDLERGENG
    按照 2.3.2 字符编码例程进行分析,得到编码如下:

    编码字符数CHANDLERGENG 的编码
    001000000110101000101101 00111011001 01001011110 01010010001 01011011110 10000011011

    3.1 结束符

    在需要在对于上述字符的编码,需要在最后加上结束符。结束符为连续 4 个 0 值。加上结束符后,得到的编码如下:

    编码字符数CHANDLERGENG 的编码结束
    001000000110101000101101 00111011001 01001011110 01010010001 01011011110 100000110110000

    如果所有的编码加起来不是 8 的倍数,则还需要在后面加上足够的 0。如上面一共有 83bits,所以与 8 的倍数还相差两位,故在最后加上 5 个 0,上表最终的数据变为:
    00100000 01101010 00101101 00111011 00101001 01111001 01001000 10101101 11101000 00110110 00000000

    3.2 补齐符

    如果最后还没有达到我们最大的 Bits 数限制,则需要在编码最后加上补齐符(Padding Bytes)。
    补齐符内容是不停重复两个字节:1110110000010001。这两个二进制转成十进制,分别为 236 与17,具体不知道为什么选这两个值……关于每一个Version的每一种纠错级别的最大Bits限制,可以参看 QR Code Spec 的第35页到44页的 Table-7 一表(笔者参考的是《ISO/IEC 18004》2000版),大致如下图 3.1 所示:



    图3.1 二维码纠错级别的最大Bits限制(部分)

    上图 3.1 中提到的 codewords,可译为码字,一个码字是一个字节。对于 Version 1 的 H 纠错级别,共需要 26 个码字,即 104bits。现在加上用 0 补全的结束符,已经有了 88bits,故还需要补上 16 bits。补齐后的编码为:

    00100000 01101010 00101101 00111011 00101001 01111001 01001000 10101101 11101000 00110110 00000000 11101100 00010001

    以上数据即为数据码(Data Codewords)

    四. 纠错码

    前文提到了不同的纠错级别(Error Correction Code Level)。有了纠错机制,才可以使得有些二维码有了残缺也可以扫码解析出来,才可以使得二维码中心位置可以供某些商家加上对解析不必要的图标。
    二维码一共有四种纠错级别:

    纠错水平可被修正容量
    L7% 码字
    M15% 码字
    Q25% 码字
    H30% 码字

    二维码对数据码加上纠错码的过程,首先要对数据码进行分组,即分成不同的块(Block)。参看如上图 3.1 所示 QR Code Spec 的第35页到44页的 Table-7 中的最下方说明了分组的定义表:



    图4.1 二维码纠错级别说明(部分)

    对于表中的最后两列的内容:

    • 纠错块个数(Number of error correction blocks):需要划分纠错快的个数;
    • 纠错块码字数(Error Correction Code Per Blocks):每个块中的码字个数,即有多少个字节Bytes;

    表中最下面关于 (c,k,r) 的解释:

    • c:码字总个数;
    • k:数据码个数;
    • r:纠错码容量

    注:

    • c,k,r的关系公式: c=k+2×r
    • 纠错码容量小于纠错码个数的一般

    以上图 4.1 中的 Version 5 + H 纠错机为例:图中红色方框说明共需要 4 个块(上下行各一组,每组 2 个块)。

    第一组的属性:

    • 纠错块个数 = 2:该组中有两个块;
    • (c, k, r) = (33, 11, 11):该组中每个块共有 33 个码字,其中 11 个数据码, 11×2=22 个纠错码;

    第二组的属性:

    • 纠错块个数 = 2:该组中有两个块;
    • (c, k, r) = (34, 12, 11):该组中每个块共有 34 个码字,其中 12 个数据码, 11×2=22 个纠错码;

    具体示例如下表所示,且由于使用二进制会使得表格过大,故转为范围在 0~255 的十进制。其中组 1 的每个块,都有 11 个数据码, 22 个纠错码;组 2 的每个块,都有 12 个数据码,22 个纠错码。

    数据每个块的纠错码
    11

    2
    67 85 70 134 87 38 85 194 119 50 6

    66 7 118 134 242 7 38 86 22 198 199
    199 11 45 115 247 241 223 229 248 154 117 236 38 6 50 17 7 236 213 87 148 235

    177 212 76 133 75 242 238 76 195 230 189 106 248 134 76 40 154 27 195 255 117 129
    21

    2
    247 119 50 7 118 134 87 38 82 6 134 151

    194 6 151 50 16 236 17 236 17 236 17 236
    96 60 202 182 124 157 200 134 27 129 209 182 70 85 246 230 247 70 66 247 118 134

    173 24 147 59 33 106 40 255 172 82 2 157 242 33 229 200 238 106 248 134 76 40

    二维码的纠错码主要是通过里德-所罗门纠错算法(Reed-Solomon Error Correction)实现的。

    (关于 Reed-Solomon 算法,现在此处占坑,回头研究了再写上去)

    五. 最终编码

    此时得到了数据,但还不能开始画图,因为二维码还需要将数据码与纠错码的各个字节交替放置。

    5.1 穿插放置

    继续以第四章中给出的示例为例,给出其穿插放置的过程。

    5.1.1 数据码穿插放置

    第四章示例中的数据码如下表所示:

    块数
    块1678570134873885194119506
    块26671181342427388622198199
    块32471195071181348738826134
    块419461515016236172361723617

    提取每一列数据:

    • 第一列:67, 66, 247, 194;
    • 第二列:85, 7, 119, 6;
    • ……
    • 第十一列:6, 199, 134, 17;
    • 第十二列:151, 236;

    将上述十二列的数据拼在一起:67, 66, 247, 194, 85, 7, 119, 6,…, 6, 199, 134, 17, 151, 236。

    纠错码如下表所示:

    块数
    块11991145115247241223229248154117
    块2177212761337524223876195230189
    块3966020218212415720013427129209
    块417324147593310640255172822

    同样的方法,将 22 列数据放在一起:199, 177, 96, 173, 11, 212, 60, 24, …, 148, 117, 118, 76, 235, 129, 134, 40。

    上述部分即为二维码的数据区。

    5.2 剩余位 (Remainder Bits)

    对于某些 Version 的二维码,得到上面的数据区结果长度依旧不足,需要加上最后的剩余位。比如对于 Version 5 + H 纠错等级的二维码,剩余位需要加 7bits,即加 7 个 0。参看 QR Code Spec 的 Table-1 一表即可查询不同 Version 的剩余位信息,如下图 5.1 所示:



    图5.1 不同 Version 的剩余位

    六. 二维码的绘制

    终于讲到二维码绘制过程了,绘制的过程按照顺序对图 1.1 中各个重要部分依次讲解。

    6.1 定位图案 (Position Detection Pattern)

    首先在二维码的三个角上绘制定位图案。定位图案与尺寸大小无关,一定是一个 7×7 的矩阵。如下图 6.1 所示:



    图6.1 定位图案 (Position Detection Pattern)

    6.2 对齐图案 (Alignment Pattern)

    然后绘制对齐图案。对齐图案与尺寸大小无关,一定是一个 5×5 的矩阵。如下图 6.2 所示:



    图6.2 对齐图案 (Alignment Pattern)

    对齐图案绘制的位置,可参看 QR Code Spec 的 Table-E.1 一表查询,部分内容如下图 6.3 所示:



    图6.3 对齐图案位置索引表(部分)

    下图 6.4 是上述表格中 Version 8 的一个例子,对于 Version 8 的二维码,行列值在 6, 24, 42 的几个点都会有对齐图案。



    图6.4 对齐图案例程 1

    下图 6.5 是最近我老妈怂恿我用支付宝抢红包时给我发来的二维码,该二维码中只有一个对齐图案, 故 Version 应在 V2——V6 之间。



    图6.5 对齐图案例程 2

    6.3 时序图案 (Timing Pattern)

    时序图案是两条连接三个定位图案的线,如下图 6.6 所示:



    图6.6 时序图案例程 1

    依旧拿支付宝红包的二维码为例,其时序图案如图 6.7 所示:



    图6.7 时序图案例程 2

    这里写图片描述

    6.4 格式信息

    格式信息如下图 6.8 所示:



    图6.8 格式信息

    格式信息在定位图案周围分布,由于定位图案个数固定为 3 个,且大小固定,故格式信息也是一个固定 15bits 的信息。每个 bit 的位置如下图 6.9 所示:(注:图中的 Dark Module 是固定永远出现的



    图6.9 格式信息位置

    15bits 中数据,按照 5bits 的数据位 + 10bits 纠错位的顺序排列:

    • 数据位占 5bits:其中 2bits 用于表示使用的纠错等级 (Error Correction Level),3bits 用于表示使用的蒙版 (Mask) 类别;
    • 纠错位占 10bits:主要通过 BCH Code 计算;

    为了减少扫描后图像识别的困难,最后还需要将 15bits 与 101010000010010 做异或 XOR 操作。因为我们在原格式信息中可能存在太多的 0 值(如纠错级别为 00,蒙版 Mask 为 000),使得格式信息全部为白色,这将增加分析图像的困难。

    纠错等级的编码如下图 6.10 的表格所示:



    图6.10 纠错等级编码

    关于蒙版图案的生成,在后文 6.7 中具体说明。格式信息的示例如下:

    假设存在纠错等级为 M(对应 00),蒙版图案对应 000,5bits 的数据位为 00101,10bits 的纠错位为 0011011100
    则生成了在异或操作之前的 bits 序列为:001010011011100
    101010000010010 做异或 XOR 操作,即得到最终格式信息:100000011001110

    6.5 版本信息 (Version Information)

    对于 Version 7 及其以上的二维码,需要加入版本信息。如下图 6.11 蓝色部分所示:



    图6.11 版本信息

    版本信息依附在定位图案周围,故大小固定为 18bits。水平竖直方向的填充方式如下图 6.12 所示:



    图6.12 版本信息填充方式

    18bits 的版本信息中,前 6bits 为版本号 (Version Number),后 12bits 为纠错码 (BCH Bits)。示例如下:

    假设存在一个 Version 为 7 的二维码(对应 6bits 版本号为 000111),其纠错码为 110010010100;
    则版本信息图案中的应填充的数据为:000111110010010100

    6.6 数据码与纠错码

    此后即可填充第五章得到的数据内容了。填充的思想如下图 6.13 的 Version 3 二维码所示,从二维码的右下角开始,沿着红线进行填充,遇到非数据区域,则绕开或跳过。



    图6.13 二维码数据填充(原始版)

    然而这样难以理解,我们可以将其分为许多小模块,然后将许多小模块串连在一起,如下图 6.14 所示(截取自 QR Code Spec 的图 15):



    图6.14 二维码数据填充

    小模块可以分为常规模块和非常规模块,每个模块的容量都为 8。常规情况下,小模块都为宽度为 2 的竖直小矩阵,按照方向将 8bits 的码字填充在内。非常规情况下,模块会产生变形。
    填充方式上图 6.14,图中深色区域(如 D1 区域)填充数据码,白色区域(如 E15 区域)填充纠错码。遍历顺序依旧从最右下角的 D1 区域开始,按照蛇形方向(D1→D2→…→D28→E1→E2→…→E16→剩余码)进行小模块的填充,并从右向左交替着上下移动。下面给出若干填充原则:

    原则 1:无论数据的填充方向是向上还是向下,常规模块(即 8bits 数据全在两列内)的排列顺序应是从右向左,如下图 6.15所示;



    图6.15 常规模块内的填充方向

    原则 2:每个码字的最高有效位(即第7个bit)应置于第一个可用位。对于向上填充的方向,最高有效位应该占据模块的右下角;向下填充的方向,最高有效位占据模块的右上方。
    注:对于某些模块(以下图 6.17 为例),如果前一个模块在右边模块的列内部结束,则该模块成为不规则模块,且与常规模块相比,原本填充方向向上时,最高位应该在右上角,此时则变为左下角;
    原则 3:当一个模块的两列同时遇到对齐图案或时序图案的水平边界时,它将继续在图案的上方或下方延续;
    原则 4:当模块到达区域的上下边界(包括二维码的上下边界、格式信息、版本信息或分隔符)时,码字中任何剩余 bits 将填充在左边的下一列中,且填充方向反转;如下图 6.16 中的两个模块遇到了二维码的上边界,则方向发生变化;



    图6.16 非常规模块填充方向的改变(举例于 QR Code Spec 图 13)

    原则 5:当模块的右一列遇到对齐图案,或遇到被版本信息占据的区域时,数据位会沿着对齐图案或版本信息旁边的一列继续填充,并形成一个不规则模块。如果当前模块填充结束之前,下一个的两列都可用,则下一个码字的最高有效位应该放在单列中,如下图 6.17 所示:



    图6.17 模块单列填充

    6.7 蒙版图案

    按照上述思路即可将二维码填充完毕。但是那些点并不均衡,如果出现了大面积的空白或黑块,扫描识别会十分困难,所以按照在前文 6.4 中格式信息的处理思路,对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。
    二维码又 8 种蒙版可以使用,如下图 6.18 所示,公式也在图中说明。蒙版只会和数据区进行异或操作,不会影响与格式信息相关的功能区。
    注:选择一个合适的蒙版也是有一定算法的。

    蒙版图案如下图 6.18 所示,对应的产生公式与蒙版 ID 如下图 6.19 的表格所示:



    图6.18 蒙版图案



    图6.19 蒙版图案产生公式

    蒙版操作的过程与对比图如下图 6.20 所示,图中最上层是没有经过蒙版操作的原始二维码,其中存在大量黑色区域,难以后续的分析识别。经过两种不同蒙版的处理,可以看到最后生成的二维码变的更加混乱,容易识别。



    图6.20 蒙版操作示例

    蒙版操作之后,得到的二维码即为最终我们平常看到的结果。

    七. 源码

    笔者原本准备用 C++ 与 OpenCV 写一个二维码解析程序,现在学了二维码的原理后,发现好难。另外网上关于二维码解析与生成的程序基本都是用 Python 写的,笔者又想找个合适机会学习一下 Python,所以这段时间就准备从二维码入手,学习一下 Python 的基础~

    源码及解析笔者会随学习的进度持续更新~

    八. 后记

    笔者学习完毕二维码内容后不禁感叹,二维码规则的制定当真是凝聚了多少研究者的心血。学无止境,在知识的海洋中,当真是需要抱着敬畏之心和谦卑的态度,才能体会到这片海洋的浩瀚。
    研究二维码的过程十分有趣,学到了不少东西,后续过程中笔者会持续更新对二维码的学习心得体会~

    展开全文
  • 生成原理 路径环路产生的原因 STP协议的基本原理 RSTP协议的基本原理
  • DEM的生成原理及应用

    2014-05-04 15:27:55
    dem的生成原理及应用。
  • 激光雷达原理介绍

    千次阅读 2021-02-02 12:39:51
    激光雷达的工作原理 激光雷达根据测量原理可以分为三角法激光雷达、脉冲法激光雷达、相干法激光雷达。本文我们只针对脉冲法...接收单元:接收光学系统、光学虑装置、光电探测器。接收反射的激光信号即回波信号;...
  • VC写的EXE生成原理,启发下大家的思路
  • token生成原理

    千次阅读 2017-11-08 10:43:33
    2.将形成的密文用句号链接起来,用服务端秘钥进行HS256加密,生成签名. 3.将前面的两个密文后面用句号链接签名形成最终的token返回给服务端 注: (1) 用户请求时携带此token(分为三部分, ...
  • 主要介绍了PHP token验证生成原理,结合实例形式分析了php的token验证原理与使用技巧,需要的朋友可以参考下
  • 这个是编译原理课的实验,采用c++实现,做的是语法分析后形成中间代码。
  • 二维码的设计原理生成规格.二维码的设计原理生成规格.二维码的设计原理生成规格.二维码的设计原理生成规格.二维码的设计原理生成规格.
  • STP生成树协议原理与配置 STP生成树协议原理与配置 STP生成树协议原理与配置
  • 由山西大学数学系教授根据MD5加密原理改写而成的加密原理。本人由此原理形成加密代码。
  • 二维码的生成原理

    千次阅读 2017-10-19 10:47:07
    二维码的基础原理是什么? 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据...
  • 聚合支付二维码生成原理

    千次阅读 2020-06-08 22:38:03
    聚合支付二维码生成原理 聚合支付平台提供平台支付URL,生成统一的支付二维码。当消费者根据二维码扫描时,聚合支付平台根据扫描者浏览器类型判断支付类型,并提交参数给聚合支付平台支付处理接口处理。平台支付处理...
  • CMS生成静态网页简单原理. CMS生成静态网页简单原理
  • 原理图,原理图怎么生成PCB,Altium源码.zip
  • License文件生成原理

    千次阅读 2020-01-02 13:32:38
    // 用私钥 对信息生成数字签名 Signature signature = Signature.getInstance(ALGORITHM_MD5_RSA); signature.initSign(prikey); signature.update(plainText.getBytes()); byte[] signed = Base64.getEncoder...
  • token验证生成原理

    千次阅读 2019-03-22 17:53:55
    <?... /** * @Author: Ding Jianlong * @Date: 2019-03-20 00:38:01 * @Last Modified by: Ding Jianlong * @Last Modified time: 2019-03...//生成发送请求的验证 token //这里的key可以是包含用户信息的内容,...
  • APP生成原理

    千次阅读 2018-05-29 10:52:05
    很久之前看到过APP生成器作用:如图,你选择写几句话,然后填写APP名称和启动图、图标等东西即可立即生成一个属于你的APP原理:通过修改文件就行,当然你的模板APP在内容上调用资源文件中的资源如我的APP,调用资源...
  • 短链接生成原理

    千次阅读 2019-11-20 15:48:16
    原理解析 当我们在浏览器里输入 https://url.cn/5fslXqH 时 DNS首先解析获得 https://url.cn 的 IP 地址 当 DNS 获得 IP 地址以后(比如:127.0.0.1),会向这个地址发送 HTTPGET 请求,查询短码 5fslXqH ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,117,362
精华内容 446,944
关键字:

像形成的原理是光的