ORACLE_DATABASE > XXXXX
TECHNICAL SECTION CONTAINED
我们无法对其中的数理性分析部分进行简化整理,此部分描述将无法通俗易懂
谜题背景
2026年5月1日,明日方舟七周年活动暨主题曲第十七章《相变临界》实装纪念活动开启。
本章剧情承接第十六章及部分SideStory,讲述了罗德岛一行前往乌萨斯泽尔格勒寻找石棺,并“复活”凯尔希的过程。
谜题叩门
由于自第十五章主题曲实装纪念活动开始,活动大厅会随玩家的推进进度发生变化,故本次活动开启时也有玩家开始记录本次活动的活动大厅差分。
但在玩家通关17-16且尚未通关17-18时,变为混杂信息的大厅背景中,疑似存在一些并不混杂的数据块。
解密过程
第一阶段:提取
对第三背景进行持续观测,可获得如下9块不同的数据块残片。
| 部分残片几乎难以被辨认,因此具有多张截图。 |
其中对部分残片(尤其是③、⑤号)的特征辨认,可认定这些数据块残片应当是某个QR码(下称“二维码”)的一部分。
| KNOWLEDGE_BASE > QR code |
| QR码,全名“快速响应矩阵图码”(Quick-Response Code),于1994年日本汽车零组件大厂电装公司的原昌宏所发明。
相对于常见的“一维码”(条码),QR码是一种横竖均有编码码位的“二维码”,因此在较小的面积内,它可以存储比一维码更多的信息,并且不局限于数字和字母,汉字等Unicode字符也能被编入其中。其特有的定位和纠错机制也能使得QR码在一些常见污染和缺损情况下也能被完美读出。 如今,QR码不仅用于工业生产,还被广泛应用于各类商业广告、移动支付等领域。我们常说的“二维码”在大多数情况下指代的也就是QR码。 |
又注意到,③的下部定位点(校正图形)被重复描绘,若要复原二维码,则还需要对残片进行先行去重。
去重且重绘后的二维码残片内容如下。
将二维码残片进行重新排列,得到
| ATTACHMENT > 残缺的二维码 |
|
尝试直接扫描二维码没有任何反应(无法解码),这应当是二维码缺失部分过多,无法纠错导致。故需要尝试对其进行复原处理,再考虑从二维码编码规则的方向进行可能的分析。
对二维码码位进行分割和重绘,可发现:
- 二维码具有完整的竖直部分,共25行码位。
- 根据二维码编码标准,这是一个版本2的二维码,大小为25×25像素(码位)。
- 在上述基础上核对水平方向,可发现左侧为01~09列,右侧为17~25列
- 第10~16列的共7列码位为丢失状态。
| ATTACHMENT > 复原的残缺二维码 |
|
| ※利用Excel转绘,其中最外侧为静态区域(分离二维码本体的区域),内侧(B2:Z26)为二维码本体。 |
第二阶段:复原
为了避免二维码受到旋转、翻转等变换影响导致无法读取,二维码存在一套定位标志系统。在正确方向的情况下,于版本2的二维码中:
- 三个定位标志(7×7大小的大定位点)分别位于左下、左上和右上方;
- 一个校正标志(5×5大小的小定位点)位于右下方,且距离右侧和下侧4个码位;
- 两个定时标志带(黑白相间颜色循环)一条位于左侧两个定位标志的右边缘,一条位于上侧两个定位标志的下边缘;
- 一个暗模块(1×1大小的辅助定位点),位于左下格式信息的上方1个码位,永远为黑色。
因此可以补全K8~Q8的缺失部分,即 白黑白黑白黑白。
此外,二维码中存在格式信息,用于指导解码器如何进行解码。
格式信息在二维码中存有两份以供容错,分别位于:
- 左上角定位标志空白外沿,读码时跳过定时标志带的码位;
- 左下角定位标志右侧空白外沿 + 右上角定位标志下侧空白外沿。
两者可读出相同的码位序列,注意二维码中,黑块(有色块)是1,白块(无色块)是0,因此得到的格式信息码为:
110100101110110
|
根据编读码规则:
- 首先与固定掩码
101010000010010作异或计算 - 之后拆出前5位,这5位的前2位是纠错等级(二维码全图被破坏后的信息恢复容许面积),后三位是掩模图形/掩码(编码原信息所使用的掩码图形序号和编码算法)。
得到:
| 格式信息码 | 11010 0101110110
|
| 固定掩码 | 10101 0000010010
|
| 源码 | 01111 0101100100
|
即:
- 纠错等级 = 01 = L(7%缺失容错,也是本例无法直接读码的原因——超过了纠错容许)
- 掩模图形 = 111 = 7
- 后10位为源码的BCH(15,5)“纠错码”,用以保证作为关键的格式信息能够正确被解码(而且整个格式码也进行了2次保存)
- 因与复原二维码内容无关,此处不作详述。
完成以上工作后得到的二维码基础信息为:
- 版本 2(25×25)
- 纠错等级 L
- 掩模图形 7
将定位标志(含暗模块)和格式信息去除后,剩余的码位即为已编码完成的存储的数据,需要通过掩码解码后方可阅读。
对于掩码7,其对应的算法为:
\( \big((i+j) \bmod 2 + (i \cdot j) \bmod 3\big) \bmod 2 = 0 \;\Longrightarrow\; \text{该格取反} \)
其中:
- \( i \) 为横坐标(左侧为0起始,向右为正),\( j \)为纵坐标(上方为0起始,向下为正)。
- “取反”即为码位数据比特取反(1变为0,0变为1)
由于该算法中的“取反”等同于“XOR 1”,“不变”等同于“XOR 0”,因此掩码编码的本质可视为一种异或,由此可以获得一张如下的“掩码图像”:
| ATTACHMENT > 掩码7的图像格式 |
| ※位于掩码黑格的码位将在编码后反色,白格则不变。灰色部分为定位标志(含暗模块)和格式信息的存储位置。 |
只需要把存储的数据与掩码图像再做异或运算,即可得到原始数据流:
| ATTACHMENT > 残缺二维码的原始数据流 |
在二维码中,数据流从右下角开始,以蛇形顺序排列:
- 从最右侧开始,每两列划一条边界(其中最左侧的定时标志左侧6列划2列边界)
- 优先水平从右到左读位;读到边界后,向上一行(或向下,取决于当前的垂直读位方向)并重置读位头到右侧(或左侧,取决于折线方向)
- 若边界内仅有一列,则竖直移动读位。
- 无论何时,跳过定位标志和格式信息区。
按照该规律读得二进制数据流如下:
|
01000010000001101000011101000111 |
| ※空格为跳过的功能块(图中的灰色“沟壑”部分);x为残缺部分。 |
其中:
- 前4位为编码模式
- 此处为
0100,即字节模式,要求读码器优先以二进制流格式读取数据,每个数据码字为8位。
- 后X位为字符计数(在版本2中,X = 8)
- 字符计数计数的是字符串按照给定字符集编码后的字节数。
由于编码模式是字节模式,因此默认可认为是Latin-1字符集(当然具体解码仍需要视情况而定)。
此处为00100000,意味着数据长度为32个字节。
- 此后每8位即为一个数据字节,参照前文,默认以Latin-1字符集译码。
| # | 数据 | 字符 |
|---|---|---|
| 01 | 01101000 | h |
| 02 | 01110100 | t |
| 03 | 01110100 | t |
| 04 | 01110000 | p |
| 05 | 01110011 | s |
| 06 | 00111010 | : |
| 07 | 00101111 | / |
| 08 | 00101111 | / |
| 09 | 01100001 | a |
| 10 | 01101011 | k |
| 11 | 00101110 | . |
| 12 | 01101000 | h |
| 13 | 0x1x1x0x | ? |
| 14 | xxxxx0x0 | ? |
| 15 | x1x0x1x1 | ? |
| 16 | x1x1x0x0 | ? |
| 17 | x1x0x1x1 | ? |
| 18 | x1xxxxxx | ? |
| —— ...余下14字节 —— | ||
| https://ak.h?????? | ||
根据往期解谜记录,该二维码存储的应当是一个指向官网(子页面)的链接,且其开头的字符串必定为
| https://ak.hypergryph.com??????? |
| 已知25字节+未知7字节 |
对第13~18字节以Latin-1字符集编码可交叉验证:
| # | 数据 | 字符 |
|---|---|---|
| 13 | 0x1x1x0x 01111001 |
y |
| 14 | xxxxx0x0 01110000 |
p |
| 15 | x1x0x1x1 01100101 |
e |
| 16 | x1x1x0x0 01110010 |
r |
| 17 | x1x0x1x1 01100111 |
g |
| 18 | x1xxxxxx 01110010 |
r |
通过已有字符串进行补码,可得到如下的部分二维码。
这里需要引入二维码编码的另一个概念:码字。
与之前的解码读码流程(4位编码模式 + 8位字符计数 + 32个8位1字节)不同,码字是衡量二维码数据容积的基本单位,固定为8位1码字,且固定从读码起点开始。
对于版本 2、纠错等级 L的二维码,其码字规范中:
- 数据码字 = 最大34个 = 最大272位(包括编码模式、字符计数和实际数据)
- 纠错码字 = 10个
但本二维码的数据块共268位,小于数据码字的272位(最后还有4位无法填满)。按照编码规范,这四位将以0000作为终止符固定填入。
填入后继续填充纠错码字,纠错码字填完后剩余7位不填字,保留为“空白”。
| ATTACHMENT > 部分补全的二维码 |
此时该二维码数据区的结构如下:
| 码字序号 | 内容 |
|---|---|
| 00 | 编码模式 (4位) + 字符计数(8位·上半) |
| 01 | 字符计数(8位·下半)+ 字节1(8位·上半) |
| 02~25 | 字节1(8位·下半)~ 字节25(8位·上半) |
| 26 | 字节25(8位·下半)~ 字节26(8位·上半/缺失) |
| 27~32 | 字节27(8位·下半/缺失)~ 字节32(8位·上半/缺失) |
| 33 | 字节32(8位·下半/缺失)~ 终止符 |
| 34~35 | 纠错码字1~2(缺失) |
| 36 | 纠错码字3(前7位缺失)(仅剩余最后1位,xxxxxxx0) |
| 37~43 | 纠错码字4~10 |
附件
参考资料
- 作者:智能BGM

