You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

二维码(QR码)工作原理、生成解码逻辑及手工实现方法咨询

嘿,很高兴能帮你拆解QR码的工作原理,还有你关心的手动生成「QR12」二维码、手动解码的具体步骤——咱们一步步来,把这个过程讲得明明白白!

QR码(QR Code)核心工作原理

QR码本质是一种矩阵式条码,靠黑白方块的组合存储数据。它的核心设计是通过三个大定位方块(左上角、右上角、左下角)+一个小对齐方块,让扫描设备快速确定二维码的位置、大小和倾斜角度,再按固定的蛇形路径读取每个方块的黑白状态(黑=1,白=0),最后把二进制串转成对应的字符、数字或其他数据。

编码逻辑核心(以「QR12」为例)

要手动生成,得先搞懂「QR12」怎么转成二进制串:

  1. 确定版本与纠错级别:「QR12」是4个短字符,用最小的Version 1(21×21像素的矩阵)就足够,纠错级别选默认的L(允许7%的方块损坏仍能解码)。
  2. 数据编码(字母数字型)
    • QR码会先判断数据类型:「QR12」是字母+数字,属于字母数字型,对应模式指示符0010(4位二进制)。
    • 字母数字型有固定映射表:A-Z对应0-25,0-9对应26-35,还有几个特殊字符。这里Q=26,R=27,1=1,2=2。
    • 编码规则:每两个字符转成一个11位二进制数:
      • "QR":26×45 + 27 = 1197 → 转二进制是10010101101
      • "12":1×45 + 2 = 47 → 转二进制是000101111
    • 字符计数:4个字符,字母数字型用8位二进制表示,就是00000100
    • 把这些串起来:模式指示符 + 字符计数 + 编码数据0010 00000100 10010101101000101111,总共34位。
  3. 补位与纠错编码
    • 补位:要把数据位补到下一个8的倍数(方便后续处理),34位补到40位,加6个0 → 00100000010010010101101000101111000000
    • 纠错编码:用Reed-Solomon算法生成16个字节(128位)的纠错码,和补位后的数据组合,填满Version 1级别L的总数据位(208位)。

手动生成「QR12」二维码(钢笔+白纸步骤)

步骤1:画基础矩阵

先画一个21×21的方格(每个格子大小统一,比如1cm×1cm,方便对齐)。

步骤2:绘制固定图案(这些是QR码的"骨架",所有Version1二维码都一样)

  • 三个定位方块:分别在左上角(第1-7行,第1-7列)、右上角(第1-7行,第15-21列)、左下角(第15-21行,第1-7列)。每个方块是7×7,规则是:外围三层涂黑,中间留白,最中心再涂黑(类似"回"字加中心黑点)。
  • 对齐方块:Version1只有1个,在第15行第15列,3×3的方块,规则是:外围涂黑,中间留白,中心涂黑。
  • 定时图案:第8行(除了定位方块覆盖的区域)和第8列(除了定位方块覆盖的区域),交替涂黑、留白(比如第8行第8列涂黑,第9列留白,第10列涂黑…以此类推)。
  • 格式信息:在定位方块旁边的固定位置,填入纠错级别L+掩码0的编码结果101010000010010,对应位置黑=1,白=0。

步骤3:填充数据位

把之前得到的208位完整二进制串(补位数据+纠错码),按蛇形路径填充到剩余空白格子:

  • 起始点:右下角(第21行第21列)
  • 路径规则:从右向左走一行,走到左边界后,向上一行再从左向右走,重复这个"之"字形,避开所有固定图案的格子。
  • 填充规则:二进制位为1就涂黑格子,为0就留白。比如第一个位是0,右下角格子留白;第二个位0,左边相邻格子也留白;第三位1,再左边格子涂黑,以此类推。

步骤4:掩码处理

我们选的是掩码0,不需要翻转任何数据位——如果用其他掩码,需要按规则翻转黑白,但掩码0是最简单的默认选项,适合手动操作。

手动解码「QR12」二维码步骤

步骤1:定位与校正

先找到三个大定位方块,确定二维码的边界,把倾斜的二维码校正成正的21×21矩阵(可以用直尺辅助对齐)。

步骤2:标记固定图案

把定位方块、对齐方块、定时图案、格式信息的区域标记出来,这些区域不参与数据读取。

步骤3:读取二进制串

按生成时的蛇形路径,逐个读取空白格子的状态:黑=1,白=0,把所有位串起来得到208位的二进制数据。

步骤4:解析格式信息

从固定位置读取格式信息,得到纠错级别L和掩码0,确认不需要翻转数据位。

步骤5:提取核心数据

  • 前4位是模式指示符0010,对应字母数字型编码。
  • 接下来8位是字符计数00000100,代表有4个字符。
  • 再接下来22位是编码数据10010101101000101111,分成两组11位:
    • 第一组10010101101→十进制1197,1197÷45=26余27→对应Q(26)和R(27)
    • 第二组000101111→十进制47,47÷45=1余2→对应1(1)和2(2)
  • 把这些字符组合起来,就是「QR12」。

步骤6:纠错验证(可选)

如果二维码有少量损坏,可以用Reed-Solomon算法对比纠错码,修复错误的数据位——不过咱们这个例子是完整的二维码,这一步可以跳过。


内容的提问来源于stack exchange,提问作者Primo Raj

火山引擎 最新活动