一维码(条形码)

在介绍二维码之前,先来看看它的“大哥”一维码,一维码也叫条形码(P.S. 好像在日常生活中都是叫这个),它是由不同宽度的黑条和白条按照一定的顺序排列组成的平行线图案,它的宽度记录着数据信息,长度没有记录信息,条形码常用于标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等信息,比如大部分食品包装袋背后都会印有条形码。

一维码(条形码)编码规则

全球的条形码标准都是由一个叫GS1的非营利性组织管理和维护的,通常情况下条形码由 95 条红或黑色的平行竖线组成,前三条是由黑-白-黑 组成,中间的五条由白-黑-白-黑-白组成,最后的三条和前三条一样也是由黑-白-黑组成,这样就把一个条形码分为左、右两个部分。剩下的 84 (95-3-5-3=84) 条按每 7 条一组分为 12 组,每组对应着一个数字,不同的数字的具体表示因编码方式而有所不同,不过都遵循着一个规律:右侧部分每一组的白色竖线条数都是奇数个。这样不管你是正着扫描还是反着扫描都是可以识别的。

中国使用的条形码大部分都是 EAN-13 格式的,条形码数字编码的含义从左至右分别是前三位标识来源 国家编码(参考资料 1) ,比如中国为:690–699,后面的 4 ~ 8 位数字代表的是厂商公司代码,但是位数不是固定的,紧接着后面 的 9~12 位是商品编码,第 13 位是校验码,这就意味着公司编码越短,剩余可用于商品编码的位数也越多,可表示的商品也就越多,当然公司代码出售价格也相应更昂贵,另外用在商品上的 EAN-13 条码是要到 国家物品编码中心(参考资料 2) 去申请的。

二维码

二维码 是在一维码的基础之上扩展出来的,二维码有不同的种类,大体上可以分为这两种 ① 堆叠式/行排式二维条码 ② 矩阵式二维码,其中矩阵式二维码最为流行(下文的二维码指矩阵式二维码),它与一维码所不同的是它的宽度和长度均有记录数据信息,存储的数据量更大,除此之外还增加了“定位点”和“容错机制”。通过“定位点”使读码机正确识别进行解读,所以二维码不管是从何种方向读取都是可以被识别的。“容错机制”可以在没有识别到全部条码时也能正确推断和还原出原始的条码信息,维码的纠错级别,按照不同的纠错率(全部码字与可以纠错的码字的比率)分为 L (约 7%)、M (约 15%)、Q (约 25%)、H (约 30%) 四个不同的级别。比如下面的「企鹅杏仁技术站」二维码尽管中间有公众号头像,但是依然可以正确识别出来就是这个“容错机制”的功能。不管是条形码(一维码)还是二维码其本质上都是对信息的编码,区别只是对信息的编码方式有所不同。

二维码的结构

二维码的版本从 1 ~ 40 共 40 个不同的版本,每个版本的基本结构都是相同的,所不同的是每个版本的码元(构成二维码的方形黑白点)数量不同,从版本 1 (21 × 21 码元) 至版本 40 (177 × 177 码元) 依次递增。

二维码可以分为这几不同的功能区域,分别是 版本信息、格式信息、数据及容错、定位标志、校正标志 等主要区域,其中定位标识用来对二维码进行定位,版本信息表示二维码的版本,有 40 种不同版本的二维码,从版本 1 到版本 40 ,每一版本比前一个版本每边增加 4 个码元,数据及容错用于实际保存的二维码数据信息和用于修正二维码损坏带来的错误的纠错码字,二维码的编码规则比较复杂,感兴趣的朋友可以去看看它的编码规范。

普通二维码存在的问题

以上介绍的这种普通二维码只是对文字、网址、电话等信息进行编码,不支持图片、音频、视频等内容,且生成二维码后内容无法改变,在信息内容较多时生成的二维码图案复杂,不容易识别和打印,正是由于存在这些特性故称之为静态二维码。静态二维码的好处就是无需联网也能识别,但是有些时候在线下场景经常需要打印二维码出来让用户去扫码,或者在一些运营场景下需要对用户的扫码情况进行数据统计和分析,再使用普通的二维码就无法提供这些功能了,这时候就要使用动态二维码了。

动态二维码(活码)及其原理

动态二维码也称之为活码,关键就在于“活”,“活”就是内容可变,但是二维码不变。活码的优点其实就是静态二维码的缺点,支持随时修改二维码的内容且二维码图案不变,可跟踪扫描统计数据,支持存储大量文字、图片、文件、音视、视频等内容,同时生成的图案简单易扫。实际上二维码是按照指定的规则编码后的一串字符串,通常大部分情况下是一个网址,在二维码出现之前,我们访问一个网址是打开浏览器输入网址后按下回车即可访问相应的网站,而有了二维码之后,我们使用软件扫描二维码,软件首先会做一次从二维码到文本的解析、转换,然后根据解析出来的文本结果判断是否是链接,是则跳转到这个链接,尽管对我们而言操作方式改变了,但其原理是相同的。

既然二维码背后是网址,要解决静态二维码生成后内容无法修改的问题,是不是只要把网址做成“活的”就行了,即可操控内容的链接,对外暴露的依然还是同一个网址,服务端只需要对这个网址做个二次跳转就行,实际上“活码”就是这么干的,这个对外暴露固定不变的网址也称为“活址”。此时脑海里浮现着计算机科学界一句著名的话:

计算机科学的任何一个问题,都可以通过增加一个中间层来解决。

上面的这个“活址”就是一个“中间层”的角色,屏蔽和隔离了二维码内容的变化,对外始终都只是暴露一个固定的网址。

静态二维码和动态二维码(活码)的区别

比较项 普通二维码 动态二维码(活码)
内容修改 不支持 可以随时修改
内容类型 支持文字、网址、电话等 支持文字、图片、文件、音视、视频等内容
二维码图案 内容越多越复杂 活码图案简单
数据统计 不支持 支持
样式排版 不支持 支持

总结

本文主要对条形码、静态二维码和动态二维码的一些基本概念做了简单的介绍,想要深入了解二维码的实现细节和原理的朋友可以看看耗子叔的这篇文章 二维码的生成细节(参考资料 4)和原理 或者到 官网(参考资料 5)查看相关文档。虽然现在绝大部分人对于二维码都非常熟悉,几乎每天都会进行着扫码操作,不过在人们的大脑中依然有一个“根深蒂固”的认知,认为一个二维码扫描之后只会出现一种固定的结果,在接触 活码 这个概念之前俺也是。你知道的越多,不知道的也越多。

参考资料

1、https://en.wikipedia.org/wiki/List_of_GS1_country_codes

2、http://www.ancc.org.cn/

3、https://coolshell.cn/articles/10590.html

4、https://www.qrcode.com/zh/index.html

全文完


以下文章您可能也会感兴趣:

  • 简单说说spring的循环依赖

  • Mysql redo log 漫游

  • 一个 AOP 缓存失效问题的排查

  • 小程序开发的几个好的实践

  • RabbitMQ 如何保证消息可靠性

  • 在 SpringBoot 中使用 STOMP 基于 WebSocket 建立 BS 双向通信

  • 聊聊Hystrix 命令执行流程

  • HIS 系统前端重构经验

  • SpringFox 源码分析(及 Yapi 问题的另一种解决方案)

  • Mysql 的字符集以及带来的一点存储影响

我们正在招聘 Java 工程师,欢迎有兴趣的同学投递简历到 rd-hr@xingren.com 。

二维码的原理竟如此简单,第一次有人说的这么明白相关推荐

  1. 二维码登录原理及生成与解析

    一.前言 这几天在研究二维码的扫码登录.初来乍到,还有好多东西不懂.在网上看到有人写了一些通过QRCode或者Zxing实现二维码的生成和解码.一时兴起,决定自己亲手试一试.本人是通过QRCode实现 ...

  2. 聚合支付二维码生成原理

    聚合支付二维码生成原理 聚合支付平台提供平台支付URL,生成统一的支付二维码.当消费者根据二维码扫描时,聚合支付平台根据扫描者浏览器类型判断支付类型,并提交参数给聚合支付平台支付处理接口处理.平台支付 ...

  3. 微信QQ的二维码登录原理js代码解析

    这篇文章主要大家详细解析了微信QQ的二维码登录原理js代码, 具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈 ...

  4. 二维码登录原理+Web端即时通讯技术

    前言 上周在写项目过程中遇到需要实现二维码的登录功能,将这个过程细节记录下来 二维码的登录过程,主要难点在于用户扫码了浏览器展示的二维码,但是浏览器本身是无法知道的,需要服务端告知信息. 涉及到 we ...

  5. 图示扫描二维码登录原理

    想要了解手机端扫描二维码登录原理,首先我们要了解二维码和token认证机制两个内容,接下来我们将用图示的方法来直观感受这个面试时候的paper tiger. (第一次用visio画图,用熟练之后就感觉 ...

  6. android二维码识别原理与测试方法

    首先看看二维码识别原理: 一.我们都是使用二维码生成工具制码,原理对于我们意义并不是很大,这里就不浪费地方复制黏贴了.二维码编码原理请google. 二.下面是与本次问题相关的一些经验. 1.    ...

  7. 分享一个二维码生成的接口,简单好用

    一直收藏的一个自动生成二维码的接口,可以用于把支付地址等内容转成二维码显示. 接口地址:https://api.qrserver.com/v1/create-qr-code/?size=150x150 ...

  8. 移动互联网的入口-二维码(二维码生成原理及流程)

    目录 1 引入 2 历史 2.1 一维码 2.2 二维码 3 分类 3.1 线性堆叠式二维码 3.2 矩阵式二维码 3.3 邮政码 4 QR code二维码结构 5 QR code二维码生成流程及原理 ...

  9. 微信QQ支付宝三合一收款二维码实现原理

    大家可以先看看我网站的效果: 收款吧 - 三合一收款码在线生成 收款码三合一大致原理如下: 第一步.解析用户上传的微信支付.QQ钱包.支付宝收款二维码,获取收款链接地址. 第二步.用自己的网站程序生成 ...

  10. 微信QQ的二维码登录原理浅析

    在非常多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用開始多起来,这里先说下啥是二维码,事实上二维码就是存了二进制数据的 ...

最新文章

  1. 介绍一篇关于session的好文章,写的很详细
  2. Python-类型注解(3.5引入)
  3. html应用中心模板,HTML5--应用网页模板
  4. 表单提交enctype参数详解之:application/x-www-form-urlencode和multipart/form-data
  5. webpack 4.0 中 clean-webpack-plugin 的使用
  6. sql进程意外终止_字节跳动五面都过了,竟然意外被刷了下来,问了hr原因竟说是。。。。。...
  7. 双系统下Ubuntu安装教程
  8. 一文解决十大排序算法(动画图解)
  9. 软件项目开发与管理(单代号网络图参考例题)
  10. 有道 - 扇贝 - 海词词典发音链接
  11. 计算机编程大赛报道,带你领略编程的魅力———记重庆大学程序设计大赛
  12. 排列组合思维导图_巧用思维导图做数学单元整理
  13. 计算机打字测试,打字测试
  14. 5.无线射频基础知识介绍_无线射频基础介绍
  15. 基于Web的在线教师备课系统毕业设计
  16. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习
  17. 行为识别之slowfast
  18. 情殇之《秋窗风雨夕》
  19. signature=6846357f033a668e61dd424f68d4d1c2,Wybrane aspekty zwinności organizacyjnej
  20. MySQL数据库授权备份恢复

热门文章

  1. phpmail通过qq发邮箱失败_PHPMailer使用QQ邮箱实现邮件发送功能
  2. ESP8266-连接阿里云示例
  3. 移动端事件touchstart、touchmove、touchend详解
  4. html中span隐藏属性,span标签的class属性
  5. win10删除U盘分区
  6. COLORBOX常用的属性
  7. java面试题学生表成绩表老师表_经典的SQL语句面试题
  8. 小白学python#Day5#笔耕不辍#每日一句,提高认知
  9. orc识别较慢_OCR 中文识别用哪种软件识别率比较高?
  10. 太可怕了! 五一外出还敢连WiFi?