NBT(二进制命名标签)格式为Minecraft中用于向文件中存储数据的一种存储格式。这一格式在此由Notch给出一个简略的介绍。NBT格式以树形结构并配以许多标签的形式存储数据。所有的标签都有一个独立的ID和名称。最初的版本如Minecraft Beta1.3中所示为19132个标签,但是随着铁砧的引入,增加了一个整形指针变量,标签数量增加至19133个。在NBT格式最初在Minecraft Indev的版本中只有0到10这11个标签可用。
标签的定义
每一个标签在数据树中都是一个独立的部分。标签的第一个字节为标签类型(ID)然后为标签内容(payload)。 如果母标签为Tag_Compound,则标签类型(ID)其后两字节(Tag_Short)为存储名称的长度,之后以UTF-8格式的字符串的方式存储标签。标签名称可以包含空格(从1.12开始Minecraft可能会在标签名称内加入空格),之后才是标签内容。 注意:每个NBT文件的内容必定是放在一个Tag_Compound里(有名称的,格式参见上方)。 下表所示为在19133标签版本中二进制命名标签格式中所有12个已知的标签类型(已添加第13个, id 12为从1.12 pre1 MCP[1]中反编译得到的信息,由于NBT标准文件以及不存在于Minecraft官网因此无法得知版本编号):
| ID | 图标 | 标签类型 | 内容(Payload) | 描述 |
|---|---|---|---|---|
| 0 | TAG_End | 无 | 用于标记复合标签的结尾。本标签无任何名称所以只有一个零字节。 | |
| 1 | TAG_Byte | 1字节 / 8位,有正负 | 有正负的整值数据类型,可以用于表达布尔值。数值范围为(-128 到 127) | |
| 2 | TAG_Short | 2字节 / 16位,有正负,字节序:BE(Big Endian) | 有正负的整值数据类型。 数值范围为(-32,768 到 32,767) | |
| 3 | TAG_Int | 4 字节 / 32 位,有正负,字节序:BE | 有正负的整值数据类型。数值范围为(-2,147,483,648到2,147,483,647) | |
| 4 | TAG_Long | 8 字节 / 64 位,有正负,字节序:BE | 有正负的整值数据类型。数值范围为(-9,223,372,036,854,775,808到9,223,372,036,854,775,807) | |
| 5 | TAG_Float | 4 字节 / 32 位,有正负,字节序:BE,IEEE 754-2008标准,binary32。 | 有正负的浮点数据类型。精确度随着数值不同而变化。最大值约为3.4*1038 | |
| 6 | TAG_Double | 8 字节 / 64 位,有正负,字节序:BE,IEEE 754-2008标准,binary64。 | 有正负的浮点数据类型。精确度随着数值不同而变化(比float精确)。最大值约为1.8*10308 | |
| 7 | TAG_Byte_Array | 前四个字节(TAG_Int)为内容数量(后方紧接着多少个Tag_Byte)n,紧接着为n个TAG_Byte的内容。 | 数组。 | |
| 8 | TAG_String | 前2个字节(TAG_Short)存储字符串字符的个数(字符串的长度length).然后存储UTF-8标准的字符串,没有'\0'结束符,只是以单纯的字符序列的形式存储. | 一个采用UTF-8标准的字符串,有尺寸限制,也就是说会以空结尾。 | |
| 9 | TAG_List | 第一个字节储存列表内标签的类型(ID),之后四个字节(Tag_Int)储存列表的大小size(有多少个子标签)。最后储存size个标签的内容(内容前方没有ID)。例子: 假如第一个字节是0x08,id是8,对应的标签是TAG_String,如果size是0x00000004,接下来将会存储4个TAG_String标签的内容.列表标签(既然都说了是列表)存储的内容都是相同类型的标签,所以只在第一个字节表明标签类型. | 一系列没有重复标签ID和标签名称的内容。(必须为同一类型) | |
| 10 | TAG_Compound | 一堆有名称的标签。结尾需要附加TAG_End代表Tag_Compound完结。 | 一系列完整的标签信息,包括ID、名称以及内容等。任意两个标签都不会有相同的名称。不会对标签进行任何排序。 | |
| 11 | TAG_Int_Array | 前四个字节(TAG_Int)为内容数量(后方紧接着多少个Tag_Int)n,紧接着为n个TAG_Int的内容。 | 数组。 | |
| 12 | 暂无 | TAG_Long_Array | 前四个字节(TAG_Int)为内容数量(后方紧接着多少个Tag_Long)n,紧接着为n个TAG_Long的内容。 | 数组。 |
复合标签的列表常以嵌套递归的方式出现。另外还需注意,在一个包含List的List中,每个List可以包含不同类型的数据。
文件格式
NBT文件可能经过GZip/zlib压缩的复合标签,其中包括名称和标签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文件的支持。 |
|
| NBTExplorer 论坛帖子 |
19133 | 受NBTEdit灵感所创,并基于NBTEdit,这一程序可以以Windows资源管理器的方式查看并修改NBT文件。支持压缩后或未经压缩的NBT文件,并允许对如区域文件格式和Anvil文件格式、level.dat等直接进行编辑。适用于Windows,Linux(依赖mono),Mac系统。 |
|
| NEINedit | 19132 | 基于Mac系统的NBT编辑器。 |
|
| MineBack Ultimate | 19133 | MineBack Ultimate 是一个支持所有现有的NBT格式文件(例如Map,Level,世界等)的全方位NBT编辑器。它拥有一个时尚的GUI以及很多帮助功能 |
|
| NBT2YAML | 19133 | nbt2yaml采用自定义的YAML格式,有着可供读写Minecraft NBT文件的命令行界面。并且其包括Python API可供NBT文件与简单的Python数据结构双向的解析与生成。 | |
| webNBT | 19133 | webNBT是一款运行在现代浏览器中的NBT编辑器,无需用户下载应用或加载第三方的浏览器插件(如Flash、Java)。 |
|
| NBT grammar for Synalyze It! | 19132 | 使用这种语法Synalyze它!显示一个颜色十六进制转储以及解析标签树。目前只支持未压缩的文件。 |
|





