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
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ção
Inteiros
Tamanho da string
Raiz
Usado por
Java (clássico)
Big-endian de tamanho fixo
Big-endian de 2 bytes
Nomeada
Mundos, estruturas e schematics Java
Rede Java (1.20.2+)
Big-endian de tamanho fixo
Big-endian de 2 bytes
Sem nome
Protocolo Java
Bedrock
Little-endian de tamanho fixo
Little-endian de 2 bytes
Nomeada
Mundos Bedrock, .mcstructure, valores do LevelDB
Bedrock level.dat
Little-endian de tamanho fixo
Little-endian de 2 bytes
Nomeada, após cabeçalho de 8 bytes
Metadados de mundo Bedrock
Rede Bedrock
Varint zigzag para Int e Long
Varint sem sinal
Nomeada
Protocolo 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.