<本站文本内容除另有声明外,转载时均必须注明出处。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。>

NBT格式

出自Minecraft Wiki
前往: 導覽搜尋

NBT(二進制命名標籤Named Binary Tags 格式為Minecraft中用於向檔案中存儲數據的一種存儲格式。Notch在此規範中為此格式作了簡略的介紹。NBT格式以樹形結構並配以許多標籤的形式存儲數據。所有的標籤都有一個獨立的ID和名稱。最早的已知NBT格式版本是Minecraft Beta1.3中引入的19132;隨着Anvil的引入,增加了一個整型陣列變數,版本號也隨之更新至19133。NBT標籤的歷史最早可以追溯到Indev,當時只有0到10這11個標籤可用。

另一種玩家更熟悉的NBT是純文本形式的,通常在指令裡使用。這種格式常被稱為SNBT字符串化的二進制命名標籤)。它與JSON格式不同,因此所有在NBT中使用的JSON(例如原始JSON文本)都必須放到字符串標籤中。

標籤的定義[編輯 | 編輯原始碼]

每一個標籤在數據樹中都是一個獨立的部分。標籤的第一個字節為標籤類型(ID),其後兩字節為存儲名稱的長度,之後以UTF-8格式的字符串的方式存儲標籤。儘管在預設的情況下Minecraft本身並不會存儲帶有空格的名稱,但是標籤名稱可以包含空格。最後,取決於標籤的類型,之後的字節為該標籤的輔助信息。下表所示為在19133標籤版本中二進制命名標籤格式中所有13個已知的標籤類型:

ID 圖標 標籤類型 輔助信息 SNBT格式‌‌[僅Java版] 描述
0 TAG_End - 用於標記複合標籤的結尾。本標籤無任何名稱所以只有一個零字節。
1 TAG_Byte 1字節 / 8位,有正負 <number>b<number>B 有正負的整值數據類型,通常用於布爾表達式。
2 TAG_Short 2字節 / 16位,有正負,字節序:BE <number>s<number>S 有正負的整值數據類型。
3 TAG_Int 4 字節 / 32 位,有正負,字節序:BE <number> 有正負的整值數據類型。
4 TAG_Long 8 字節 / 64 位,有正負,字節序:BE <number>l<number>L 有正負的整值數據類型。
5 TAG_Float 4 字節 / 32 位,有正負,字節序:BE,IEEE 754-2008標準,binary32。 <number>f<number>F 有正負的浮點數據類型。
6 TAG_Double 8 字節 / 64 位,有正負,字節序:BE,IEEE 754-2008標準,binary64。 <decimal number><number>d<number>D 有正負的浮點數據類型。
7 TAG_Byte_Array TAG_Int的輔助信息大小以及 TAG_Byte的輔助信息大小 [B;<byte>,<byte>,...] 陣列。
8 TAG_String 前2個字節(TAG_Short)存儲字符串字符的長度。然後是以UTF-8標準存儲的字符串,因為擁有長度,因此沒有空結束符。 <a-zA-Z0-9 text>"<text>""需使用\"轉義)或'<text>''需使用\'轉義) 32,767字節會以UTF-8解析。
9 TAG_List 輔助信息的第1個字節(TAG_Byte)存儲串列標籤類型的ID,接下來的4個字節(TAG_Int)存儲串列的size,接下來的字節將存儲size個串列標籤類型的輔助信息.假如第一個字節是0x08,id是8,對應的標籤是TAG_String,如果size是0x00000004,接下來將會存儲4個TAG_String標籤的輔助信息。串列標籤(既然都說了是串列)存儲的內容都是相同類型的標籤,所以只在第一個字節表明標籤類型. [<value>,<value>,...] 一系列沒有重複標籤ID和標籤名稱的輔助信息。
10 TAG_Compound 標籤的完整形式,需要附加TAG_End {<tag name>:<value>,<tag name>:<value>,...} 一系列完整的標籤信息,包括ID、名稱以及輔助信息等。任意兩個標籤都不會有相同的名稱。
11 TAG_Int_Array 輔助信息前4個字節(TAG_Int)用於存儲陣列的大小size,緊接size*4 字節(TAG_Int)的陣列數據.占用存儲空間: 4+4*size Byte [I;<integer>,<integer>,...] 存儲TAG_Int的輔助信息的陣列。
12 TAG_Long_Array 輔助信息前4個字節(TAG_Int)用於存儲陣列的大小size,緊接size*8 字節(TAG_Long)的陣列數據。占用存儲空間: 4+8*size Byte [L;<long>,<long>,...] 存儲TAG_Long的輔助信息的陣列。

複合標籤的串列常以嵌套遞歸的方式出現。另外還需注意,在一個包含List的List中,每個List可以包含不同類型的數據。

檔案格式[編輯 | 編輯原始碼]

NBT檔案是經過GZip壓縮的複合標籤,其中包括名稱和標籤ID。在Minecraft中使用的檔案有可能未經壓縮,但是基於Notch最初的敘述,檔案需要經GZip進行壓縮。檔案中並沒有用於顯示版本及其他信息的頭檔案,只是在level.dat中才出現這一顯示版本的內容。

在Minecraft中的應用[編輯 | 編輯原始碼]

NBT檔案格式在Minecraft的應用不盡相同。在某些情況下,空目錄可能不會表示字節標籤串列而表示為一系列正確標籤類型的串列。額外的,幾乎所有的根標籤均包含一個空字符串並包含一個複合標籤存儲實際的數據和名稱,如下所示:

  • 在Minecraft NBT結構中最常看到的根標籤。
    •  SomeName: 在根標籤下的唯一一個標籤——這一標籤擁有名稱和實際的數據。

另一點值得注意的是,儘管Notch最初所述允許在標籤名稱中出現空格,甚至是在例子中也出現了包含空格的標籤名稱,但是Minecraft並不會識別帶有空格的標籤名稱。使用大小寫字母混排也會造成不穩定,推薦使用小駝峰(lowerCamelCase)和大駝峰(UpperCamelCase)的命名規則,有時甚至可以使用全部小寫字母的方式。

應用[編輯 | 編輯原始碼]

  • level.dat以壓縮後的NBT格式進行存儲。
  • <player>.dat以壓縮後的NBT格式進行存儲。
  • idcounts.dat以未壓縮的NBT格式進行存儲。
  • map_<#>.dat以壓縮後的NBT格式進行存儲。
  • Servers.dat以未壓縮的NBT格式進行存儲多人伺服器清單。
  • 區塊以壓縮後的NBT格式進行存儲區域檔案。

軟件[編輯 | 編輯原始碼]

Mojang已經公布了Java中的NBT示例類檔案,並將其作為Region至Anvil格式轉換器源代碼的一部分使用。[1]Java版1.13起,Minecraft內置了SNBT和壓縮後的NBT檔案的轉換器,且通常與官方伺服器一同發布。[2]

官方[編輯 | 編輯原始碼]

參見: :en:Tutorials/Running the Data Generator

來自Minecraft的數據生成器能夠將輸入資料夾中擴展名為.snbt的未壓縮字符串化NBT檔案轉換為輸出資料夾中擴展名為.nbt的GZip壓縮NBT格式檔案,反之亦然。

原版數據生成器可以將任何GZip壓縮的NBT格式轉換為SNBT格式。您只需將檔案的擴展名(如level.dat)更改為level.nbt並將其放入輸入資料夾,然後生成器將對GZip壓縮的NBT數據進行解碼。

第三方[編輯 | 編輯原始碼]

雖然暫時除去Minecraft本身還沒有一款用於編輯NBT格式的官方指定軟件,但是在Minecraft社區中已經開發出一些用於編輯和修改NBT檔案的軟件。

名稱 NBT版本 介紹 截圖
NBTEdit 19132 可以以Windows資源管理器的方式查看並修改NBT檔案。但是由於其版本陳舊,不支持多標籤以相同名字出現,並會強制修改類型,這一軟件缺乏對未經壓縮的NBT檔案的支持。 NBTEdit Level.Dat.png
NBTExplorer
論壇帖子
19133 受NBTEdit靈感所創,並基於NBTEdit,這一程序可以以Windows資源管理器的方式查看並修改NBT檔案。支持壓縮後或未經壓縮的NBT檔案,並允許對如區域檔案格式Anvil檔案格式、level.dat等直接進行編輯。適用於Windows,Linux(依賴mono),Mac系統。 NBTExplorer.png
NEINedit 19132 基於Mac系統的NBT編輯器。 NEINedit.png
MineBack Ultimate 19133 MineBack Ultimate 是一個支持所有現有的NBT格式檔案(例如Map,Level,世界等)的全方位NBT編輯器。它擁有一個時尚的GUI以及很多幫助功能 MineBackNBTEditor.png
NBT2YAML 19133 nbt2yaml採用自訂的YAML格式,有着可供讀寫Minecraft NBT檔案的指令行介面。並且其包括Python API可供NBT檔案與簡單的Python數據結構雙向的解析與生成。
webNBT 19133 webNBT是一款執行在現代瀏覽器中的NBT編輯器,無需用戶下載應用或載入第三方的瀏覽器插件(如Flash、Java)。 WebNBT.png
NBT grammar for Synalyze It! 19132 使用這種語法Synalyze它!顯示一個顏色十六進制轉儲以及解析標籤樹。目前只支持未壓縮的檔案。 Synalyze-It-NBT-decoded.png

歷史[編輯 | 編輯原始碼]

Java版
1.0.02011年9月28日Notch致力於「用物品實例來存儲任意信息」。
1.12?加入了Long陣列標籤。
1.1318w01a為Minecraft Client和預設的多人遊戲軟件添加了數據生成器。
1.1419w08a"外,字符串標籤現在可以寫在'之間。[3]

參考[編輯 | 編輯原始碼]