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

NBT格式

出自Minecraft Wiki
前往: 導覽搜尋

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

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

每一個標籤在數據樹中都是一個獨立的部分。標籤的第一個字節為標籤類型(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格式進行存儲區域文件。

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

雖然暫時除去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