请问这样的二维码可以修复吗?有没有高手试一下?

Reimu Hakurei,维护人界与兽界的巫女

应当注意的是这个 QR 码的正确角度。

首先容易数出这个 QR 码的尺寸是 37×37,即 Version 5。

观察左上角特征,可以判定 Error Correction Level 为 M,Mask Pattern 为 2。

查阅 ISO/IEC 18004:2024 表 9 可知 Version 5 Level M 有两个 Block,其 (c, k, r) 如下:

  • (67, 43, 12)
  • (67, 43, 12)

这样便知道了整个 QR 码的布局。据此肉眼识读数据,发现一堆对半拆开的 ASCII 数据,可以猜测以 Byte mode(即 0100)开头而不带 ECI。

因为隐隐约约可以看出这是个微信收款音箱,直接填个「http://payapp.weixin.qq.com」或「http://payapp.wechatpay.cn」上去。至于到底是哪个域名,协议是 HTTP 还是 HTTPS,要看用哪个更能和已知数据贴合。试了试发现开头数据填「https://payapp.wechatpay.cn/」更能贴合。

还可以继续往后填「smartqr/home?code=」。

这时候第一个 Block 的明文其实只有八位未知了,因此只要结合纠错码就能解算第一个 Block。为此,先填完最上面能看到的部分罢。

列 GF(256) 上的线性方程组解出第一个 Block。

这时可以发现第一组数据(Byte mode)的长度是 58,结束后恰好出现了 0010——这意味着进入了 Alphanumeric mode。应该就是 SN 号。需要注意的是这个网址出现的 SN 号是 18 位,其中末 7 位是贴纸写着的那一串。而在 SN 号出现之前,应该有个「&sn=」;SN 号结束之后,就是 Padding bits 和 Pad codewords 了。还可以对 code 加上 ASCII 约束。

结合上面的分析可以继续补数据。

最后再继续对着描图:

这个时候残余的只有 156 位,足以定解,继续列方程组就能顺利解算出结果啦。