Mii 二维码格式解析:FFL 字节与 0x04
用普通手机扫码器扫一张 Mii 二维码,得到的是一屏乱码。用 3DS 扫同一张码,得到的却是一个完整的角色——脸、名字、体型,外加一套关于“谁能复制、谁能分享、谁能编辑”的隐形规则。这两种体验之间的落差,是一小块二进制工程,也正是我们的 Mii 二维码解锁器存在的理由。这篇指南会沿着工具实际运行的路径把格式讲一遍:QR 层、FFL 数据块、0x01 和 0x04 这些偏移上的权限字段,以及主机弹出“这只 Mii 无法编辑”的准确原因。下文的每一个结论,都来自我们工具里跑着的同一个解码器——没有一句是从 wiki 上转述的。
第一个意外:Mii 二维码装的不是文字
日常生活里扫的二维码,装的多半是纯文本——一个网址、一串 Wi-Fi 密码、一份菜单。Mii 二维码不是。它装的是 Byte Mode(字节模式)载荷:一整块原始二进制,只对认识这套格式的主机才有意义。手机扫码器读到它,会试图把这段字节当某种文字编码来解释,解释到一半失败,于是打出了你见过的那堆乱码。
技术差异藏在 QR 规范本身。二维码可以用多种模式承载数据:数字、字母数字、字节、汉字。普通文本用字母数字或字节模式加 UTF-8 载荷;而 Mii 虽然也用字节模式,载荷却压根不是文字。我们的解码器用 jsQR 读码,取的是原始 binaryData 数组而不是解码出的字符串——这是整个实现里最要紧的一条:一旦把 Mii 二维码当成字符串处理,它就已经坏了。
把码写回去时,同一个陷阱倒着又出现一次。面向网址的二维码生成器会顺手把二进制数据从文本层再编码一遍,然后毁掉它。所以我们的编码器把缓冲区按字节模式、固定的 QR 版本和纠错等级原样写入,并把尺寸调到 3DS 摄像头能从手机屏幕上稳定识别的程度。二进制进、二进制出——载荷从头到尾不经过任何字符串。
FFL:每只 Mii 背后的那张脸库
二维码里的数据用 FFL(Face Library)格式描述这只 Mii——这是 Nintendo 跨主机共用的角色渲染库,社区已将其公开整理成文档;Wii、3DS、Wii U 与 Switch 游戏消费的都是同一套 Mii 数据,底层正是它。FFL 把一只 Mii 存成紧凑的结构:名字、性别等身份字段,一组描述五官、体型和配色的外观字段,再加一小块权限标志位,决定别人的主机可以对这只角色做什么。
这个格式的两个特性决定了指南后面的一切。第一,它跨主机世代稳定——3DS 时代的 Mii 二维码在 Wii U 上照样能扫,Switch 游戏消费的也是同一套底层数据,所以格式类文章写一次就一直有用。第二,它对位置极其敏感——每个字段都在距块首的固定偏移上,而不同世代之间这些偏移会略有移动。错一个偏移,你得到的不是一只稍微有点怪的 Mii,而是一只扫都扫不出来的 Mii。这种严格也解释了为什么格式能原封不动地熬过一次次主机换代:游戏不去重造它,只是把自己的角色数据递给同一座库。
头部字段逐个看
在做任何修改之前,我们的工具会先解析块的开头几个字节,给你一份预览。格式定义的头部字段如下:
| 偏移 | 字段 | 内容 |
|---|---|---|
0x00 | 版本字节 | 这个块用的是哪一代 Mii 数据 |
0x01 | 选项标志 | bit 0 是复制允许位;其余位是不雅词标志和区域锁 |
0x02–0x03 | 槽位头 | 这只 Mii 保存在 Mii工作室的哪一页、哪个槽位 |
0x04–0x0B | System ID | 标识所有者主机的 8 个字节——编辑限制校验的就是它,也是解锁流程改写的目标 |
0x18 | 性别与个人信息位 | 性别位,外加生日和常用色 |
0x1A–0x2D | 名字 | UTF-16 编码,最多 10 个字符,null 结尾 |
0x30 | 分享标志 | bit 0 是禁止分享开关(来源:3dbrew 的 Mii 格式文档) |
名字字段值得单独停下来讲,因为手改字节最容易栽在这里。“10 个字符”不等于“10 个字节”:UTF-16里每个字符占两个字节,空位用 null 填充,解码器读到第一个 null 就停。如果你用 UTF-8 写名字,日文名或德文名在主机上立刻变成乱码;忘了补 null 结尾,名字就会一路吃进紧随其后的数据里。
头部之后才是 Mii 本体——几十个外观字段,覆盖脸型、发型、眼睛、眉毛、鼻子、嘴、眼镜、身高、体型和常用色,各自压进特定的比特位。我们的工具会读取其中足够画预览的一部分,然后刻意再也不碰:一个会改动脸上哪怕一个像素的解锁,是不配被信任的解锁。
为什么扫来的 Mii 会说“无法编辑”
权限系统存在的原因是:Mii 二维码本来就是一种分享机制,而 Nintendo 把“分享到什么程度”的决定权交给了创作者。一只 Mii 在主机上诞生时,它的 FFL 数据会把创作者的选择以标志位的形式记录在块里。另一台主机扫到这张码时,到来的 Mii 带着已接收(received)的标记——主机会把原创作者当作作者,读取标志位,然后照章办事:
- 复制允许——创作者若关掉了复制,接收方主机就不会让你把这只 Mii 再复制出去或存到别处。
- 禁止分享——分享被关时,这只 Mii 无法再生成新的二维码传给下一个人。
- 编辑——无论前两个标志位如何,收到的 Mii 在接收方主机上永远不可编辑。编辑权属于这只 Mii 出生时的那台主机。同样的归属逻辑也决定着性格与嗓音的默认值,我们的声音合成指南拆过这件事。
最让人意外的就是第三条。你可以扫一只 Mii、欣赏它、在游戏里用它——但当你想在编辑器里打开它时,主机会拒绝,并告诉你“这只 Mii 无法编辑”。这不是故障,而是那些标志位正在一丝不苟地执行作者当初的委托。
绕开它的官方途径只有一条,而且只在创作者允许复制时有效:在 3DS 上把这只 Mii 复制进自己的 Mii工作室,再从部件开始重捏一遍——重捏出来的 Mii 生在你的主机上,完全可编辑。但这套流程除了小修小补之外都很折腾,而且一旦连复制都被锁住,它就直接失效了。这个“官方上可行”与“实际中好用”之间的空档,正是所有解锁工具栖身的地方。
解锁器改了什么、绝不碰什么
有了上面的字段地图就能明白,解锁操作是刻意做得很小的:工具读入载荷,改写 0x04 处的 System ID 区块——那是主机判断“收到的 Mii 能否编辑”的归属标识——替换之后,这只 Mii 不再指向原来的所有者。想改名的话,它会在同一遍里以正确的 UTF-16 重写名字字段。随后把整个块重新编码成一张全新的字节模式二维码。其余所有字节,一个一个原样放行。
再编码这一步比听起来重要。新的二维码按字节模式、固定版本和纠错等级 M 生成,渲染尺寸经过调校,方便 3DS 摄像头从手机屏幕上读。QR 参数选错,码看上去可能完好无损,偏偏你指的那台主机就是不肯认——纠错等级是在“扫码稳健度”与“数据容量”之间做交换,而 Mii 载荷紧贴容量上限,这里的取舍绝不是审美问题。
整个往返都在你的浏览器里完成:载荷从你拖进来的图片里解出,在内存中暂存、修改、再画回二维码,会话历史保存在你自己浏览器的 IndexedDB 里。中间没有服务器——这不只是隐私上的体面,它还意味着“工具偷偷留下谁的 Mii 副本”这条路径根本不存在,包括你自己的。
从 3DS 到 Switch:摄像头、二维码与访问密钥
如今围绕 Mii 分享的种种困惑,大部分都能用硬件沿革解释清楚。3DS 有双摄像头,扫二维码是那里的原生操作——Mii工作室、朋友聚会 新生活、Miitopia 和擦肩通信全都吃这张码。Switch 把摄像头整个砍掉了:Switch 的 Mii工作室仍然能读 3DS 或 Wii U 的 Mii 二维码——对着空气读,因为根本没有摄像头可读。Switch 留下的是 FFL 数据本身,这也是本文的格式知识至今有效的原因;换掉的是分享那一层。
Switch 版 Miitopia 上,Nintendo 用访问密钥(access key)替代了二维码:输入一串短码,就能从在线服务下载一只 Mii;发布自己的 Mii 则会得到另一串密钥。Switch 2 延续了这一做法。访问密钥优雅地解决了没有摄像头的问题,但也继承了同一套权限哲学——下载来的 Mii 是别人的作品——而且只在支持该服务的游戏里可用。
连接两个时代的实用桥梁就是 3DS 时代的格式:拿到一张 Mii 二维码,权限没开就先解锁,再用玩家们各显神通的办法把它送进 Switch 的 Mii工作室——破解机上模拟扫描也好,照着解码预览用手重新捏一遍也好。一旦这只 Mii 在 Switch 上落了户,它的数据就是原生的,Switch 所有支持 Mii 的地方都认它——从《朋友聚会 新生活:Living the Dream》到 Miitopia。又因为性格系统就骑在同一套 Mii 数据上,我们朋友聚会 新生活 MBTI 映射里的内容,对这只移植过来的角色照样成立。
为什么用十六进制编辑器手改通常行不通
看到这里你大概已经跃跃欲试,想跳过工具直接在十六进制编辑器里翻字节。那里埋着三种失败方式,而且全都静音——文件绝不会主动告诉你哪里错了。
- 1世代不同,偏移不同。Wii、3DS、Switch 各代的字段位置并不重合。按错误布局打的补丁,改的就是错误的字节——而最先遭殃的往往是你从没想碰的外观字段。
- 2字符串陷阱。十六进制编辑器默认按文本思考。打开载荷、把名字当 ASCII 改掉、保存——UTF-16 的名字字段从此错位,紧随其后的字节全部遭殃。
- 3再编码陷阱。字节改完,还差一张二维码。面向网址的生成器会经文本层编码,把二进制载荷搅得粉碎;只有字节模式、版本与纠错等级都对得上的编码器,才能产出主机会认的码。
专用工具存在的意义,就是让这三种错误在原理上无法发生:偏移固定、字节模式进出、名字字段按正确的编码和填充写入。我们的解锁器之所以是一个页面而不是文档里的一行注释,理由全在这里。
关于 Mii 二维码,大家常问的问题
解锁 Mii 二维码合法吗?安全吗?
安全性上,机制本身站在你这边:解锁只重写权限相关的字节,外观块原封不动,所以改出来的码要么以“同样的 Mii+新的权限”被识别,要么干脆识别不出来,不存在第三种悄悄变样的可能。合法性上,这套格式是社区公开整理的文档,工具处理的又是你已经持有的 Mii 数据;再往后怎么用,和其他所有同人活动一样受同一套规矩约束——尊重原作者,别把别人的角色当成自己的作品。至于 Nintendo 对改过 Mii 数据的态度,和它对主机文件系统其他部分的态度一致:非官方支持区域,自行斟酌。
Miitopia 和 Super Smash Bros. Ultimate 的 Mii 也能用吗?
能。Miitopia 和 Super Smash Bros. Ultimate 消费的是与朋友聚会 新生活、3DS Mii工作室相同的 FFL 格式 Mii 数据,所以为某个游戏生成的二维码,只要主机接受 QR 输入,就能扫进其他游戏。格式是共同语言,游戏只是不同的听众。
主机摄像头扫不出解锁后的二维码怎么办?
十次里有九次是光学问题而不是数据问题。屏幕亮度拉满,让二维码在不虚焦的前提下填满取景框,擦干净摄像头镜头,避开顶灯的反光。还不行就重新生成——二维码的截图可能带上压缩噪点,破坏解码;正确做法永远是保存原始渲染图。
解锁后的 Mii 在游戏里外观会变吗?
不会。外观块是逐字节放行的——脸、发型、颜色、身高、名字、嗓音设置,全都按创作者的设定原样抵达。肉眼可见的变化只会出现在你主动要求的地方,比如改名。如果扫出来的 Mii 看起来不对劲,多半是 QR 图片本身在中途受损:先重新生成、重新扫,再去怀疑数据。
能在 Switch 上直接编辑 Mii 吗?
接收来的不行。Switch 的 Mii工作室可以编辑本机创建的 Mii,但从外部到来的 Mii——无论访问密钥还是扫描——都会为保护作者而锁定,与 3DS 如出一辙。想要可编辑的副本,路径依然要经过格式:先解锁原始二维码,让它以“本地、可编辑”的身份被识别,再用你手头可行的办法把它送到 Switch 上。
Switch 2 的新 Mii 体系呢?
Switch 2 在 Miitopia 上延续了访问密钥方式,底层的 Mii 数据依旧出自 FFL 这一脉。二维码这种物理分享媒介属于带摄像头的 3DS 和 Wii U——而这恰恰是格式知识至今值钱的原因:那些二维码承载的数据,与你今天 Switch 游戏消费的数据,是同一套。
原始权限以后能恢复吗?
把原始二维码图片留好——解锁从不覆盖你的源文件,它只是生成一张打开了标志位的新码。哪天想要回那些限制,原图仍然带着创作者的设置,照原样扫回去即可。做不到的是给一只已经“住进”主机的 Mii 重新上锁:经解锁扫描授予你主机的编辑权,将永远属于这只 Mii。向朋友借 Mii 来解锁之前,先记住这种不对称。
自己动手试试
让这套格式变得具体的最快办法,是把你自己的一只 Mii 喂给工具,看着那些字段一个个浮现:
- Mii 二维码解锁器——拖入一张码,看名字和权限标志被解出,并重新生成可编辑的码。
- Mii 造人——从零捏一只 Mii,基于 FFL 实时渲染并导出。
- Mii 眼睛编辑——专攻决定 Mii 神情的眼睛形状。
- 语音实验室——听听朋友聚会 新生活如何把性格变成合成嗓音。