Referência do Formato NBT

Compatível com Minecraft Bedrock Edition e Java Edition — e com todos os softwares de servidor de ambas as edições, conhecidos ou não: Vanilla, Paper, Spigot, Purpur, Folia, Fabric, Forge, NeoForge, Mohist, Sponge, Bedrock Dedicated Server, PocketMine-MP, Nukkit, PowerNukkitX, Cloudburst, Dragonfly, Endstone, LeviLamina e outros. Lista completa.

NBT (Named Binary Tag) é o formato de árvore binária do Minecraft: uma tag tem um tipo de um byte, nome com prefixo de tamanho e dados; compounds se aninham até que um byte TAG_End os encerre. Existem 13 tipos de tag e cinco codificações usadas em Java e Bedrock. Esta página documenta todas; o editor permite verificá-las em arquivos reais.

13 tipos de tagBig-endianLittle-endianVarintgzipzlibSNBT

Arraste qualquer arquivo NBT para inspecionar aqui

level.dat · .nbt · .mcstructure · .schem · .schematic · .dat · dumps de chunks

Os 13 tipos de tag

IDTagDadosSNBT
0TAG_EndNenhum — encerra um compound—
1TAG_Byte1 byte, com sinal −128…1271b
2TAG_Short2 bytes, com sinal1s
3TAG_Int4 bytes, com sinal1
4TAG_Long8 bytes, com sinal1L
5TAG_Float4 bytes, IEEE 7541.0f
6TAG_Double8 bytes, IEEE 7541.0d
7TAG_Byte_Arraytamanho Int, seguido dessa quantidade de bytes[B;1b,2b]
8TAG_Stringtamanho Short sem sinal, seguido de bytes UTF-8"text"
9TAG_Listbyte do tipo, tamanho Int e dados sem nomes[1,2]
10TAG_Compoundtipo + nome + dados repetidos até TAG_End{a:1}
11TAG_Int_Arraytamanho Int e essa quantidade de Ints de 4 bytes[I;1,2]
12TAG_Long_Arraytamanho Int e essa quantidade de Longs de 8 bytes[L;1L,2L]

Um arquivo contém um único TAG_Compound: um byte de tipo 0x0A, um nome e o conteúdo do compound. Tags nomeadas só aparecem dentro de compounds; elementos de listas contêm apenas dados, por isso toda lista é homogênea.

Cinco codificações em uso

CodificaçãoInteirosTamanho da stringRaizUsado por
Java (clássico)Big-endian de tamanho fixoBig-endian de 2 bytesNomeadaMundos, estruturas e schematics Java
Rede Java (1.20.2+)Big-endian de tamanho fixoBig-endian de 2 bytesSem nomeProtocolo Java
BedrockLittle-endian de tamanho fixoLittle-endian de 2 bytesNomeadaMundos Bedrock, .mcstructure, valores do LevelDB
Bedrock level.datLittle-endian de tamanho fixoLittle-endian de 2 bytesNomeada, após cabeçalho de 8 bytesMetadados de mundo Bedrock
Rede BedrockVarint zigzag para Int e LongVarint sem sinalNomeadaProtocolo Bedrock

Na codificação varint, TAG_Short, TAG_Float e TAG_Double permanecem little-endian de tamanho fixo; apenas TAG_Int e TAG_Long viram varints zigzag, e os tamanhos de arrays e listas seguem o formato de TAG_Int. Tamanhos de strings são varints sem sinal, eliminando o limite de 65.535 bytes das codificações fixas.

Strings: UTF-8 modificado e UTF-8

Java serializa strings com DataOutputStream.writeUTF; esse é UTF-8 modificado; um caractere NUL é gravado como C0 80 em vez de 00. Caracteres fora do Plano Multilíngue Básico são duas metades substitutas de três bytes (CESU-8), não uma sequência de quatro bytes. Bedrock usa UTF-8 padrão. Usar uma só codificação para ambos corrompe emojis e parte do texto CJK; este editor codifica conforme o formato.

Compressão

NBT não é compactado por si só; o contêiner define isso. Arquivos Java geralmente usam gzip (magic 1F 8B); dados de chunks em regiões usam zlib (magic 78 01, 78 9C ou 78 DA); o Bedrock armazena level.dat e estruturas sem compressão. A detecção usa magic bytes, permitindo ao parser tratar os três casos. Compressão incorreta é a causa mais comum de um mundo editado não carregar.

Um arquivo mínimo, byte a byte

O exemplo clássico hello_world.nbt: um compound raiz chamado hello world contendo uma tag String name com o valor Bananrama. Na codificação big-endian do Java:

0A                          TAG_Compound
00 0B 68 65 6C 6C 6F 20 77 6F 72 6C 64   name length 11, "hello world"
   08                       TAG_String
   00 04 6E 61 6D 65        name length 4, "name"
   00 09 42 61 6E 61 6E 72 61 6D 61      value length 9, "Bananrama"
00                          TAG_End

O mesmo documento em little-endian do Bedrock muda apenas a ordem dos bytes nos dois campos de tamanho: 0B 00 em vez de 00 0B No NBT de rede Bedrock, os tamanhos viram bytes varint únicos, 0B e 04, sem padding. Solte qualquer versão no editor para identificar a codificação.

SNBT

SNBT é NBT em texto, usado por comandos: /data merge entity @s {Invulnerable:1b}. Os sufixos de tipo preservam os dados: b Byte, s Short, L Long, f Float, d Double e nenhum para Int; arrays tipados são escritos como [B;…], [I;…], [L;…]. O editor exporta SNBT de qualquer arquivo, permitindo comparar versões do mundo como texto.

Perguntas frequentes

Existe uma especificação NBT oficial?

Não há especificação formal da Mojang. Notch documentou o formato em 2010, e a comunidade o mantém desde então; os IDs e a estrutura desta página correspondem ao formato atual do jogo.

Por que o Bedrock usa little-endian?

O motor do Bedrock é C++ e visa hardware little-endian, portanto armazena valores na ordem nativa. A serialização Java é big-endian conforme o contrato DataOutput.

O que é codificação varint zigzag?

Uma forma de gravar inteiros em poucos bytes mantendo negativos curtos: o sinal vai para o bit baixo, então −1 vira 1 e 1 vira 2. O protocolo Bedrock usa isso para Ints e Longs.

Uma TAG_List pode conter tipos diferentes?

Não. Uma lista declara um tipo de elemento, e todas as entradas devem corresponder. Dados mistos exigem uma lista de compounds.

Qual é o tamanho máximo de uma string?

65.535 bytes nas codificações fixas, pois o campo de tamanho é um Short sem sinal. A codificação varint de rede não tem limite prático.

Ferramentas relacionadas