Thursday 14 May 2020

肉眼解析 QR code 的 "a"

 最近读了这篇科普文后,初学尝试用肉眼解析出简单 QR code 的 "a"。

先去这个网站输入 a,生成我们要的简单 QR。




放大:



首先找出版本号,方程式是 (格子边长 - 17) / 4, 因此上图是 (21 格 - 17) / 4 = Version 1。因此版本 2 的边长会多 4 格, 以此类推到 (177 格 - 17) / 4 = 最大的版本 40。对照某些表时,不同版本不同值, 例如 Character Count Indicator 长度, 所以需要版本号。







然后,找用来去掩码的掩模 (Mask pattern),左上寻像图形的正下方 (或左下的正右方) 的第 3-5 格。





三格全黑表示掩模方程式是 j%3 = 0。
解读方程式是从 0, 1, 2 ... 算起,j 是 x轴, i 是 y轴。

EC (Error Correction) Level 则是左上寻像图形 (或左下的正右方) 的第 1-2 格。
两格全黑表示 11 XOR 10(即固定 Mask pattern “10”1010000010010 的左边两个 bits) = 01, 即纠错能力(仅7%)最差的 L 级。因此一眼可见: 黑黑 L(7% 👎), 黑白 M(15%), 白黑 Q(25%), 白白 H(30% 👍)。这篇文我们不理这个。



把掩模从左上往右下盖着,黑格 1, 白格 0, XOR (即不一样才放黑, 1), 最右边形成 (从下往上读。由于掩模右两格都是白色, XOR 后仍然一样,  所以原图不需要改。):

寻像图形 (Finder/Position pattern/marker)
全白
格式信息 (format information)
1 0 结束, 0000 0001, 表示 Data 长度只有 1 个字节。
0 0
0 0
0 0 开始 ECI Character count indicator。由于是 Version 1 且之前的 8-bit Byte Mode, 因此接着只有 8-bit。


0 0 结束,0100,对照 Mode indicators 表,0100 表示 8-bit Byte Mode。


1 0 开始 Mode indicator。
0 1 结束, 0001 1010, 表示 16+8+2=26, 对表 (或这个)即是 ISO/IEC 10646 UTF-8 编码。











0 1
1 0
0 0 开始 ECI 编码。
1 1 继续 -> 右上(1) -> 左上(1), 0111 表示 Mode Indicator 是 ECI。
1 0 开始。顺序: 右下(0) -> 左下(1)。每一行都是从右往左开始读, 不存在左往右。

扫 corner 转去左边的两 bits (从上往下读。掩模这里的两格是白黑, 所以左边不需要改, 只需想像左边纵的黑格是 1,想像右边纵的白格是 1 ):

寻像图形
全白
格式信息 (format information)
1 0 开始 Data, 01 开头属于 0bbb bbbb 的 1 个 codeword(8-bits)。


0 1
0 0
1 0 结束,0110 0001,表示 64+32+1=97,即 ASCII 的 “a”, 找到我们此次的目标。
0 0 由于剩下大于 4 够位, 所以继续 “结束符“。
0 0 结束,4 bit terminator 0000。
0 0 由于 so far 累积的总数是 36-bits ,36 (或最后的 codeword 仅是 4) 不是 8 的倍数, 所以加多 4 个 0 变成 40-bits。
0 0 结束,0000。
1 1
0 1
1 1
0 0

参考:

No comments:

Post a Comment