本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详细信息…

NBT格式

来自Minecraft Wiki
跳转至: 导航搜索

NBT(二进制命名标签)格式为Minecraft中用于向文件中存储数据的一种存储格式。Notch在此规范中为此格式作了简略的介绍。NBT格式以树形结构并配以许多标签的形式存储数据。所有的标签都有一个独立的ID和名称。最早的已知NBT格式版本是Minecraft Beta1.3中引入的19132;随着铁砧的引入,增加了一个整型数组变量,版本号也随之更新至19133。NBT标签的历史最早可以追溯到Minecraft Indev,当时只有0到10这11个标签可用。

标签的定义[编辑 | 编辑源代码]

每一个标签在数据树中都是一个独立的部分。标签的第一个字节为标签类型(ID),其后两字节为存储名称的长度,之后以UTF-8格式的字符串的方式存储标签。尽管在默认的情况下Minecraft本身并不会存储带有空格的名称,但是标签名称可以包含空格。最后,取决于标签的类型,之后的字节为该标签的辅助信息。下表所示为在19133标签版本中二进制命名标签格式中所有12个已知的标签类型:

ID 图标 标签类型 辅助信息 描述
0 TAG_End 用于标记复合标签的结尾。本标签无任何名称所以只有一个零字节。
1
TAG_Byte 1字节 / 8位,有正负 有正负的整值数据类型,通常用于布尔表达式。
2
TAG_Short 2字节 / 16位,有正负,字节序:BE 有正负的整值数据类型。
3
TAG_Int 4 字节 / 32 位,有正负,字节序:BE 有正负的整值数据类型。
4
TAG_Long 8 字节 / 64 位,有正负,字节序:BE 有正负的整值数据类型。
5
TAG_Float 4 字节 / 32 位,有正负,字节序:BE,IEEE 754-2008标准,binary32。 有正负的浮点数据类型。
6
TAG_Double 8 字节 / 64 位,有正负,字节序:BE,IEEE 754-2008标准,binary64。 有正负的浮点数据类型。
7
TAG_Byte_Array TAG_Int的辅助信息大小以及 TAG_Byte的辅助信息大小 数组。
8
TAG_String 前2个字节(TAG_Short)存储字符串字符的个数(字符串的长度length).然后存储UTF-8标准的字符串,没有'\0'结束符,只是以单纯的字符序列的形式存储. 一个采用UTF-8标准的字符串,有尺寸限制,也就是说会以空结尾。
9
TAG_List 辅助信息的第1个字节(TAG_Byte)存储列表标签类型的ID,接下来的4个字节(TAG_Int)存储列表的size,接下来的字节将存储size个列表标签类型的辅助信息.假如第一个字节是0x08,id是8,对应的标签是TAG_String,如果size是0x00000004,接下来将会存储4个TAG_String标签的辅助信息.列表标签(既然都说了是列表)存储的内容都是相同类型的标签,所以只在第一个字节表明标签类型. 一系列没有重复标签ID和标签名称的辅助信息。
10
TAG_Compound 标签的完整形式,需要附加TAG_End 一系列完整的标签信息,包括ID、名称以及辅助信息等。任意两个标签都不会有相同的名称。
11
TAG_Int_Array 辅助信息前4个字节(TAG_Int)用于存储数组的大小size,紧接size*4 字节(TAG_Int)的数组数据.占用存储空间: 4+4*size Byte 存储TAG_Int的辅助信息的数组。
12
TAG_Long_Array 辅助信息前4个字节(TAG_Int)用于存储数组的大小size,紧接size*8 字节(TAG_Long)的数组数据。占用存储空间: 4+8*size Byte 存储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