返回博客列表

黑白方块里到底藏了什么?二维码是怎么被读出来的

2026-09-24 4 分钟

现在扫二维码几乎是条件反射——加好友、点餐、付款、看菜单,手机摄像头一对准就自动跳转。但那一堆密密麻麻的黑白方块到底是怎么「藏」下这些信息的,很少有人细想过。

先搞懂它和条形码有什么不一样

超市商品上的条形码只是一排粗细不同的竖线,信息只能沿着一个方向(横向)排列,能存的内容非常有限,一般就是一串数字编号。二维码是在两个方向(横向+纵向)上都排布了信息,存储空间一下子大了几十倍,不只能存数字,还能存整段网址、文字甚至一段 WiFi 密码。

那三个角上的大方块是干嘛的

留意一下二维码三个角上比较显眼的「回」字形大方块,这是专门给扫描设备用的「定位图案」——不管你的手机是斜着拿、倒着拿还是转了个角度,扫描程序都能靠这三个方块迅速判断出二维码的方向和边界,再开始读取里面的内容。

黑白格子到底是怎么「写」进信息的

二维码里每一个小方格(专业说法叫「模块」)只有黑、白两种状态,对应二进制的 0 和 1。按照固定的编码规则把要存的文字、网址先转换成一长串 0 和 1,再按顺序填进网格里,就变成了我们看到的黑白图案。扫描时反过来,把每个格子的黑白状态重新读成一串 0 和 1,再解码还原成原本的文字内容。

为什么脏了、破了一角还能扫出来

二维码标准里内置了一种叫「纠错码」的机制,会在编码时故意多存一部分冗余信息,哪怕一部分格子被遮挡、弄脏甚至印刷模糊,扫描程序依然能靠剩下的信息把内容完整还原出来。很多品牌二维码中间贴着自己的 logo,正是利用了这个特性——被 logo 挡住的那部分,靠纠错机制补回来了。

想自己做一个,不用懂原理也能生成

了解原理是一回事,实际要用的时候完全不需要自己算编码——用二维码生成器,输入网址或文字,选好容错级别,几秒钟就能拿到一张能用的二维码;如果是给实体商品编号用的传统条形码,条形码生成器也能按不同格式标准直接生成。

我实际算了一下:一个真实的二维码有多大

二维码生成器用的是 qrcode 这个开源库(我测试用的是 1.5.4 版),提供 L、M、Q、H 四个纠错级别,默认是 M。按二维码标准,四个级别大约能恢复 7%、15%、25%、30% 的损坏数据。我用同一个库给工具默认的网址 https://example.com(19 个字符)实际生成了一个:L、M、Q 三档都是版本 2,边长 25×25 个模块;切到 H 档后,为了留出更多纠错数据,版本升到 3,边长变成 29×29 个模块。换成一个 42 个字符的较长网址,L 和 M 是版本 3(29×29),Q 是版本 4(33×33),H 是版本 5(37×37)。可见纠错级别越高,同样的内容需要的格子越多,图案也越密。工具里上传中间 Logo 时会自动把 L 或 M 切到 H,道理就在这里:Logo 盖住的格子要靠纠错数据补回来。

很多技术在没拆开看之前都显得像「黑魔法」,拆开之后其实逻辑很朴素——希望这篇文章能让你下次扫码的时候,多一点「原来是这样」的乐趣。