NBT

二进制命名标签(Name Binary Tag)NBT格式为Minecraft中用于向文件中存储数据的一种存储格式。NBT格式以树形结构并配以许多标签的形式存储数据。所有的标签都有一个独立的ID和名称。最初的版本如Minecraft Beta1.3中所示为19132个标签,但是随着铁砧的引入,增加了一个整形指针变量,标签数量增加至19133个。在NBT格式最初在Minecraft Indev的版本中只有0到10这11个标签可用。

NBT的作用

NBT在物品中就有,是数据标签的一种,通过修改物品的NBT可以自定义物品的伤害、耐久等。

NBT的定义

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

ID图标标签类型辅助信息描述
0TAG_End用于标记复合标签的结尾。本标签无任何名称所以只有一个零字节。
1
TAG_Byte1字节 / 8位,有正负有正负的整值数据类型,通常用于布尔表达式。
2
TAG_Short2字节 / 16位,有正负,字节序:BE有正负的整值数据类型。
3
TAG_Int4 字节 / 32 位,有正负,字节序:BE有正负的整值数据类型。
4
TAG_Long8 字节 / 64 位,有正负,字节序:BE有正负的整值数据类型。
5
TAG_Float4 字节 / 32 位,有正负,字节序:BE,IEEE 754-2008标准,binary32。有正负的浮点数据类型。
6
TAG_Double8 字节 / 64 位,有正负,字节序:BE,IEEE 754-2008标准,binary64。有正负的浮点数据类型。
7
TAG_Byte_ArrayTAG_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的辅助信息的数组。