一次诡异的扫码经历
前几天在做项目开发时,遇到了一个让人百思不得其解的问题:
同一个二维码,用微信扫一扫得到的结果是:
淘宝闪购#2IYMDYGIL001,02,BZND用专业的扫码器扫出来的却是:
230183152229174157233151170232180173#2|YMDYG|L001,02,BZND
明明扫的是同一张图片,为什么结果完全不同?这不禁让我对二维码的解析机制产生了浓厚兴趣。
一、二维码的工作原理
1.1 二维码的结构
二维码(QR Code)本质上是一种矩阵式二维条码,由日本电装公司于1994年发明。它的核心原理是用黑白相间的几何图形按一定规律排列,通过二进制编码来存储信息:
- 黑色方块= 二进制"1"
- 白色方块= 二进制"0"
一个标准的QR码由以下几个部分组成:
| 组成部分 | 功能说明 |
|---|---|
| 位置探测图形 | 三个角落的"回"字形图案,用于定位二维码的方向 |
| 校正图形 | 帮助校正扭曲的图像,提高识别率 |
| 格式信息 | 存储纠错等级和掩码模式 |
| 版本信息 | 标识二维码的版本(1-40) |
| 数据编码区 | 实际存储数据的位置 |
| 纠错码 | 用于数据纠错,支持最多30%的损坏恢复 |
1.2 数据编码方式
QR码支持四种数据编码模式:
- 数字模式:0-9,每3个字符编码为10位
- 字母数字模式:0-9,A-Z,空格,$%*±./:,每2个字符编码为11位
- 字节模式:支持UTF-8等编码
- 日文模式:Shift-JIS编码的日文字符
二、为什么同一二维码解析结果不同?
2.1 核心原因:原始数据 vs 业务解析
问题的根本原因在于:微信等App对二维码数据做了二次业务解析,而普通扫码器只输出原始数据。
┌─────────────────────────────────────────────────────────────┐ │ 二维码存储的数据 │ │ 230183152229174157233151170232180173#2|YMDYG|L001,02,BZND │ └─────────────────────────────────────────────────────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ │ 微信扫一扫 │ │ 普通扫码器 │ │ 业务规则解析 │ │ 输出原始数据 │ └──────────────────┘ └──────────────────┘ │ │ ▼ ▼ 淘宝闪购#2IYMDYGIL001,02,BZND 230183...|YMDYG|L001,02,BZND