Mii QR碼格式解析:FFL 位元組與 0x04
用一般手機的掃碼器掃一張 Mii QR碼,跳出來的是整面亂碼。把同一張碼拿到 3DS 上掃,出現的卻是一隻完整的角色——臉、名字、體型,外加一套關於「誰能複製、誰能分享、誰能編輯」的隱形規則。這兩種體驗之間的落差,是一小塊二進位工程的結晶,也正是我們的 Mii QR碼解鎖器存在的理由。這篇指南會沿著工具實際運行的路徑,把格式從頭走一遍:QR 層、FFL 資料區塊、0x01 與 0x04 這些偏移上的權限欄位,以及主機跳出「這隻 Mii 無法編輯」的確切原因。文中每個結論都來自我們工具裡實際運轉的同一套解碼器——沒有任何一句是從 wiki 轉手倒賣的。
第一個意外:Mii QR碼裝的不是文字
日常在掃的 QR碼,裝的多半是純文字——一個網址、一組 Wi-Fi 密碼、一份菜單。Mii QR碼不是。它裝的是 Byte Mode(位元組模式)酬載:一整塊原始二進位,只對認得這套格式的主機才有意義。手機掃碼器讀到它,會想把這串位元組當成某種文字編碼來解讀,解到一半宣告失敗,於是印出你見過的那串亂碼。
技術差異藏在 QR 規範本身。QR碼可以用多種模式承載資料:數字、英數、位元組、漢字。一般文字走英數或位元組模式加 UTF-8 酬載;Mii 雖然同樣走位元組模式,酬載卻根本不是文字。我們的解碼器用 jsQR 讀碼,取的是原始 binaryData 陣列,而不是解碼後的字串——這是整份實作中最要緊的一條:一旦把 Mii QR碼當字串處理,它就已經壞了。
把碼寫回去時,同一個陷阱會倒著再出現一次。面向網址的 QR碼產生器會順手把二進位資料丟進文字層重新編碼,然後把它毀了。所以我們的編碼器讓緩衝區以位元組模式、固定的 QR 版本與糾錯等級原樣寫入,並把尺寸調到 3DS 相機能從手機螢幕上穩定辨識的程度。二進位進、二進位出——酬載從頭到尾不經過任何字串。
FFL:每隻 Mii 背後的那座臉孔資料庫
QR碼裡的資料,是用 FFL(Face Library)格式描述這隻 Mii 的——那是 Nintendo 跨主機共用的角色算繪函式庫,社群已將其整理成公開文件;Wii、3DS、Wii U 與 Switch 遊戲消費的同一套 Mii 資料,底層正是它。FFL 把一隻 Mii 存成緊湊的結構:名字、性別等識別欄位,一組描述五官、體型與配色的外觀欄位,再加一小塊權限旗標,決定別人的主機能對這隻角色做什麼。
這個格式的兩個特性,決定了指南接下來的一切。第一,它跨主機世代穩定——3DS 時代的 Mii QR碼在 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 QR碼本質上是一種分享機制,而 Nintendo 把「分享到什麼程度」的決定權交給了創作者。一隻 Mii 在主機上誕生時,它的 FFL 資料會把創作者的選擇以旗標形式記錄在區塊裡。另一台主機掃到這張碼時,抵達的 Mii 帶著已接收(received)的標記——主機會把原創者視為作者,讀取旗標,然後照章執行:
- 允許複製——創作者若關閉了複製,接收方的主機就不會讓你把這隻 Mii 再複製出去或存到別處。
- 禁止分享——分享被關時,這隻 Mii 無法再產生新的 QR碼流傳給下一個人。
- 編輯——無論前兩個旗標為何,收到的 Mii 在接收方主機上永遠無法編輯。編輯權屬於這隻 Mii 誕生的那台主機。同樣的歸屬邏輯也決定了性格與嗓音的預設值,我們的語音合成指南拆解過這件事。
最讓人意外的就是第三條。你可以掃一隻 Mii、欣賞它、在遊戲裡使用它——但當你想在編輯器裡打開它時,主機會拒絕,並告訴你「這隻 Mii 無法編輯」。這不是故障,而是那些旗標正一絲不苟地執行作者當初的囑託。
繞開它的官方途徑只有一條,而且只在創作者允許複製時成立:在 3DS 上把這隻 Mii 複製進自己的 Mii工作室,再從零件開始重新捏一隻——重捏出來的 Mii 生在你的主機上,完全可編輯。但這套流程除了小修小補之外都相當折騰,而且一旦連複製都被鎖住,它就直接失效。這個「官方允許」與「實務好用」之間的縫隙,正是所有解鎖工具棲身之處。
解鎖器改了什麼、絕不碰什麼
有了上面的欄位地圖就能明白,解鎖操作是刻意做得很小的:工具讀入酬載,改寫 0x04 處的 System ID 區塊——那是主機判斷「收到的 Mii 能否編輯」的歸屬識別——替換之後,這隻 Mii 不再指向原來的擁有者。想改名的話,它會在同一輪裡以正確的 UTF-16 重寫名字欄位。接著把整個區塊重新編碼成一張全新的位元組模式 QR碼。其餘所有位元組,一個一個原樣放行。
再編碼這一步比聽起來重要。新的 QR碼以位元組模式、固定版本與糾錯等級 M 產生,算繪尺寸經過調校,方便 3DS 相機從手機螢幕上讀取。QR 參數選錯,碼看起來可能完好無缺,偏偏你指的那台主機就是不肯認——糾錯等級是在「掃碼穩健度」與「資料容量」之間做交換,而 Mii 酬載緊貼容量上限,這裡的取捨絕不是美感問題。
整趟往返都在你的瀏覽器裡完成:酬載從你拖進來的圖片解出,在記憶體中暫存、修改、再畫回 QR碼,工作階段紀錄存在你自己瀏覽器的 IndexedDB 裡。中間沒有伺服器——這不只是隱私上的體面,更代表「工具偷偷留下一份誰的 Mii」這條路徑根本不存在——連你自己的也一樣。
從 3DS 到 Switch:相機、QR碼與存取金鑰
如今圍繞 Mii 分享的種種困惑,大部分都能用硬體沿革解釋清楚。3DS 有雙相機,掃 QR碼是那個世代的原生操作——Mii工作室、朋友聚會 新生活、Miitopia 和擦身通信全都吃這張碼。Switch 把相機整個拿掉了:Switch 的 Mii工作室仍然能讀 3DS 或 Wii U 的 Mii QR碼——對著空氣讀,因為根本沒有相機可讀。Switch 留下的是 FFL 資料本身,這也是本文的格式知識至今有效的原因;換掉的是分享那一層。
Switch 版 Miitopia 上,Nintendo 用存取金鑰(access key)取代了 QR碼:輸入一組短碼,就能從線上服務下載一隻 Mii;發布自己的 Mii 則會得到另一組金鑰。Switch 2 延續了這個做法。存取金鑰漂亮地解決了沒有相機的問題,卻也繼承了同一套權限哲學——下載來的 Mii 是別人的作品——而且只在支援該服務的遊戲裡可用。
銜接兩個時代的實用橋梁,就是 3DS 時代的格式:取得一張 Mii QR碼,權限沒開就先解鎖,再用玩家們各顯神通的方法把它送進 Switch 的 Mii工作室——在模擬器上掃描也罷,照著解碼預覽用手重捏一隻也罷。一旦這隻 Mii 在 Switch 上落了戶,它的資料就是原生的,Switch 所有支援 Mii 的地方都認得它——從《朋友聚會 新生活:Living the Dream》到 Miitopia。又因為性格系統就騎在同一套 Mii 資料上,我們朋友聚會 新生活 MBTI 映射的內容,對這隻移植過來的角色照樣成立。
為什麼用十六進位編輯器手改通常行不通
看到這裡,你大概已經躍躍欲試,想跳過工具直接在十六進位編輯器裡翻位元組。那裡埋著三種失敗方式,而且全都無聲無息——檔案絕不會主動告訴你哪裡出錯。
- 1世代不同,偏移不同。Wii、3DS、Switch 各代的欄位位置並不重合。照錯誤佈局打的補丁,改的就是錯誤的位元組——而最先遭殃的,往往是你從沒打算碰的外觀欄位。
- 2字串陷阱。十六進位編輯器預設以文字思考。打開酬載、把名字當 ASCII 改掉、存檔——UTF-16 的名字欄位從此錯位,緊接其後的位元組全部跟著毀掉。
- 3再編碼陷阱。位元組改完,還差一張 QR碼。面向網址的產生器會經文字層編碼,把二進位酬載攪得粉碎;只有位元組模式、版本與糾錯等級都對得上的編碼器,才產得出主機肯認的碼。
專用工具存在的意義,就是讓這三種錯誤在原理上無從發生:偏移固定、位元組模式進出、名字欄位以正確的編碼與填充寫入。我們的解鎖器之所以是一個頁面而不是文件裡的一行註解,理由全在這裡。
關於 Mii QR碼,大家常問的問題
解鎖 Mii QR碼合法嗎?安全嗎?
安全性上,機制本身站在你這邊:解鎖只改寫權限相關的位元組,外觀區塊原封不動,所以改出來的碼若不是以「同一隻 Mii+新權限」被辨識,就是完全不被辨識,不存在第三種悄悄變樣的可能。合法性上,這套格式是社群公開整理的文件,工具處理的又是你已經持有的 Mii 資料;再往後怎麼用,和所有同人活動一樣受同一套規矩約束——尊重原作者,別把別人的角色當成自己的作品。至於 Nintendo 對改動過 Mii 資料的態度,與它對主機檔案系統其他部分的態度一致:非官方支援領域,請自行斟酌。
Miitopia 和 Super Smash Bros. Ultimate 的 Mii 也適用嗎?
適用。Miitopia 和 Super Smash Bros. Ultimate 消費的是與朋友聚會 新生活、3DS Mii工作室相同的 FFL 格式 Mii 資料,所以為某款遊戲產生的 QR碼,只要主機接受 QR 輸入,就能掃進其他遊戲。格式是共同語言,遊戲只是不同的聽眾。
主機相機掃不出解鎖後的 QR碼怎麼辦?
十次裡有九次是光學問題而非資料問題。把螢幕亮度拉到最亮,讓 QR碼在不失焦的前提下填滿取景畫面,把相機鏡頭擦乾淨,避開天花板的燈光反光。還是不行就重新產生——QR碼的螢幕截圖可能帶有壓縮雜訊,破壞解碼;正確做法永遠是保存原始算繪圖。
解鎖後的 Mii 在遊戲裡外觀會變嗎?
不會。外觀區塊是逐位元組放行的——臉、髮型、顏色、身高、名字、嗓音設定,全部照創作者的設定原樣抵達。肉眼可見的變化只會出現在你主動要求的地方,例如改名。如果掃出來的 Mii 看起來不對勁,多半是 QR碼圖片本身在中途受損:先重新產生、重新掃,再去懷疑資料。
可以在 Switch 上直接編輯 Mii 嗎?
接收來的不行。Switch 的 Mii工作室可以編輯本機建立的 Mii,但從外部而來的 Mii——無論經存取金鑰還是掃描——都會為了保護作者而遭鎖定,與 3DS 如出一轍。想要可編輯的副本,路徑依然要經過格式:先解鎖原始 QR碼,讓它以「本機、可編輯」的身分被辨識,再用你手邊可行的辦法把它送到 Switch 上。
Switch 2 的新 Mii 系統呢?
Switch 2 在 Miitopia 上延續了存取金鑰方式,底層的 Mii 資料依舊出自 FFL 這一脈。QR碼這種實體分享媒介屬於帶相機的 3DS 和 Wii U——而這恰恰是格式知識至今值錢的原因:那些 QR碼承載的資料,與你今天 Switch 遊戲消費的資料,是同一套。
原始權限之後還能復原嗎?
把原始 QR碼圖片留好——解鎖從不覆蓋你的來源檔,它只是產生一張打開了旗標的新碼。哪天想把限制要回來,原圖仍然帶著創作者的設定,照原樣掃回去即可。做不到的,是替一隻已經「住進」主機的 Mii 重新上鎖:經解鎖掃描授予你主機的編輯權,將永遠屬於這隻 Mii。要向朋友借 Mii 來解鎖之前,先記住這種不對稱。
自己動手試試
讓這套格式變得具體的最快辦法,是把你自己的 Mii 餵給工具,看著那些欄位一一浮現:
- Mii QR碼解鎖器——拖入一張碼,看名字與權限旗標被解出,並重新產生可編輯的碼。
- Mii 造人——從零捏一隻 Mii,基於 FFL 即時算繪並匯出。
- Mii 眼睛編輯——專攻決定 Mii 神情的眼睛形狀。
- 語音實驗室——聽聽朋友聚會 新生活如何把性格變成合成嗓音。