liukai 发表于 昨天 18:44

常识二维码的实现原理和实现过程[数据码编码]


  ? ? ? ?在阅读这篇文章前,你需要具备一定的编程能力。二维码生成器在线制作http://www.erweicaihong.cn/二维彩虹提供专业的二维码在线生成和美化。在线生成器可把文本、电子邮件、名片、网址、微信收款等信息一键制作自定义动态二维码图片,不仅能够随时让用户更改二维码背后的信息而无需更改二维码,而且能够让用户追踪最有价值的市场数据!
https://img.zcool.cn/community/01e1ab5bc5aa8da801213dea4ac270.gif

  ? ? ? ?数据码编码,就是将二维码存储的字符转化成二进制。 这些字符可以是数字、字母、中文。 那么数据码编码时,就根据数字模式,数字字母模式,8位字节模式,中文模式进行编码。 8位字节模式可以描述整个计算机世界的字符,而其他模式是量身打造的,所以所需字节比8位字节模式要少。

  ? ? ? ?该教程目前只实现了数字模式和8位字节模式的编码规范。

  图1 数据码编码流程图表1 模式指示符

  ? ? ? ? 模式指示符在数据码字中占4位,是每个数据码字的第一部分。

  表2 字符计数指示符

  ? ? ? ?字符计数指示符的位数在数据码字中根据版本和编码模式而有所不同,它计算的是模式编码时,源字符的长度。例如:对"qrcode"进行编码,那么所获得的源字符长度是6,如果编码模式选择的是字母数字模式,版本选择的是1,那么对应的该字符计数指示符的位数是9,而6在二进制中是"110",那么该字符计数指示符是"000000110"。

  ? ? ? ?例1:将"01234567"进行编码,首先要对这些数字进行分割。分割成 012 345 67的形式,即将源字符(纯数字),如果字符长度满足3的倍数,那么正好可以分割成3n的序列形式。但是如果不满足3的倍数,那么就可以用3n+1和3n+2的序列形式来表示。所以示例中是一个标准的3n+2序列形式。

  ? ? ? ?在二进制中想要表示这些数字,3位的十进制数字,最大为999,二进制中2的10次方可以涵盖这些数字,2位的十进制数字,最大为99,二进制中2的7次方可以涵盖这些数字,1位的十进制数字,最大为9,二进制中2的4次方可以涵盖这些数字。

  ? ? ? ?例1:将"01234567"进行编码:

  ? ? ? ?012->0000001100

  ? ? ? ?345->0101011001

  ? ? ? ?67->1000011

  ? ? ? ?例2:将"0125"进行编码:

  ? ? ? ?012->0000001100

  ? ? ? ?5->0101

  ? ? ? ? ?8位字节编码即依据ASCII编码表进行编码。如果你想用8位字节表示中文,那么可以根据GB2312或UTF-8来对中文字符进行处理,具体的GB2312处理方式:

  c++ GB2312编码规则

  ? ? 以此,可以对照GB2312编码表对中文向8位字节流转换。

  ? ? ? ? 我们有义务标识数据码已经结束,并且应该根据二维码定义的数据码长度巧妙得告诉数据码结束了。

  ?结束指示符:"0000",如果剩余位不足4位,填充满0。

  ? ? ? ?我们有义务将数据码补充成完整的8位字节。

  ?根据数据码[模式指示符+字符计数指示符+模式编码+结束指示符]的长度补充0,直至该长度满足8的倍数。(1byte=8bit)。

  ? ? ? ?我们有义务将数据码补充成与版本模式一致的长度。

  ? ? ? ?根据数据码[模式指示符+字符计数指示符+模式编码+结束指示符+补充0]的长度轮流补充"11101100","00010001",以此让数据码字符合二维码版本、编码模式、纠错等级规定的数据码字长度。

  如果你想了解更多有关代码如何实现,请通过以下链接获取到我在CSDN上的原创文章https://blog.csdn.net/bosaidongmomo/article/details/103195498
页: [1]
查看完整版本: 常识二维码的实现原理和实现过程[数据码编码]