Referensi Format NBT

Mendukung Minecraft Bedrock Edition dan Java Edition — serta semua core server untuk keduanya, baik yang populer maupun yang jarang dikenal: Vanilla, Paper, Spigot, Purpur, Folia, Fabric, Forge, NeoForge, Mohist, Sponge, Bedrock Dedicated Server, PocketMine-MP, Nukkit, PowerNukkitX, Cloudburst, Dragonfly, Endstone, LeviLamina, dan lainnya. Daftar lengkap.

NBT (Named Binary Tag) adalah format pohon biner Minecraft: satu tag terdiri dari tipe satu byte, nama dengan awalan panjang, dan payload; compound dapat bersarang hingga ditutup oleh byte TAG_End. Ada 13 tipe tag dan lima pengodean yang digunakan di Java dan Bedrock. Halaman ini mendokumentasikan semuanya, sedangkan editor di atas dapat memeriksa setiap penjelasan memakai file nyata.

13 tipe tagBig-endianLittle-endianVarintgzipzlibSNBT

Letakkan file NBT apa pun untuk diperiksa di sini

level.dat · .nbt · .mcstructure · .schem · .schematic · .dat · dump chunk

13 tipe tag

IdTagIsi dataSNBT
0TAG_EndTidak ada — menutup compound—
1TAG_Byte1 byte, bertanda −128…1271b
2TAG_Short2 byte, bertanda1s
3TAG_Int4 byte, bertanda1
4TAG_Long8 byte, bertanda1L
5TAG_Float4 byte, IEEE 7541.0f
6TAG_Double8 byte, IEEE 7541.0d
7TAG_Byte_Arraypanjang int, lalu byte sebanyak nilai tersebut[B;1b,2b]
8TAG_Stringpanjang unsigned short, lalu byte UTF-8"text"
9TAG_Listbyte tipe elemen, panjang int, lalu payload tanpa nama[1,2]
10TAG_Compoundtipe + nama + payload berulang hingga TAG_End{a:1}
11TAG_Int_Arraypanjang int, lalu sejumlah int 4 byte[I;1,2]
12TAG_Long_Arraypanjang int, lalu sejumlah long 8 byte[L;1L,2L]

Satu file memiliki satu root TAG_Compound: satu byte tipe 0x0A, nama, lalu isi compound. Tag bernama hanya muncul di dalam compound — elemen list hanya membawa payload, sehingga satu list selalu homogen.

Lima pengodean yang digunakan

PengodeanIntegerPanjang stringAkarDigunakan oleh
Java (klasik)Big-endian dengan lebar tetapBig-endian 2 byteBernamaDunia, struktur, dan skematik Java
Jaringan Java (1.20.2+)Big-endian dengan lebar tetapBig-endian 2 byteTanpa namaProtokol Java
BedrockLittle-endian dengan lebar tetapLittle-endian 2 byteBernamaDunia Bedrock, .mcstructure, nilai LevelDB
Bedrock level.datLittle-endian dengan lebar tetapLittle-endian 2 byteBernama, setelah header 8 byteMetadata dunia Bedrock
Jaringan BedrockVarint zigzag untuk int dan longVarint tanpa tandaBernamaProtokol Bedrock

Dalam pengodean varint, TAG_Short, TAG_Float, dan TAG_Double tetap little-endian dengan lebar tetap; hanya TAG_Int dan TAG_Long yang menjadi varint zigzag, sedangkan panjang array dan list mengikuti perilaku TAG_Int. Panjang string memakai varint tanpa tanda, sehingga batas 65535 byte pada pengodean lebar tetap juga tidak berlaku.

String: UTF-8 termodifikasi dan UTF-8

Java melakukan serialisasi string dengan DataOutputStream.writeUTF, yaitu UTF-8 termodifikasi: karakter NUL ditulis sebagai C0 80, bukan 00, sedangkan karakter di luar Basic Multilingual Plane ditulis sebagai dua bagian surrogate tiga byte (CESU-8), bukan satu urutan empat byte. Bedrock memakai UTF-8 standar. Alat yang mengasumsikan satu pengodean untuk keduanya akan merusak emoji dan sebagian teks CJK saat menyimpan — editor ini memakai pengodean sesuai format, sehingga nama dunia berisi emoji tetap utuh setelah dibuka dan disimpan kembali.

Kompresi

NBT sendiri tidak dikompresi; wadah yang menentukannya. File Java biasanya memakai gzip (magic 1F 8B), payload chunk di dalam file region memakai zlib (magic 78 01, 78 9C, atau 78 DA), sedangkan Bedrock menyimpan level.dat dan file struktur tanpa kompresi. Deteksi dilakukan melalui magic byte, sehingga parser yang sama menangani ketiganya — dan file yang disimpan dengan kompresi salah merupakan penyebab paling umum dunia hasil edit manual tidak dapat dimuat.

File minimal, byte demi byte

Contoh standar hello_world.nbt: root compound bernama hello world yang berisi satu tag string name dengan nilai Bananrama. Dalam pengodean big-endian 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

Dokumen yang sama dalam pengodean little-endian Bedrock hanya berbeda pada urutan byte dua field panjang: 0B 00, bukan 00 0B. Dalam NBT jaringan Bedrock, panjang tersebut menjadi byte varint tunggal, 0B dan 04, tanpa padding. Masukkan salah satu dari ketiga format ke editor di atas untuk mengetahui format yang diterima.

SNBT

SNBT adalah NBT dalam bentuk teks dan digunakan oleh perintah: /data merge entity @s {Invulnerable:1b}. Sufiks tipe menjaga informasi tipe agar tidak hilang — b untuk byte, s untuk short, L untuk long, f untuk float, d untuk double, tanpa sufiks untuk int — dan literal array bertipe ditulis sebagai [B;…], [I;…], [L;…]. Editor mengekspor SNBT dari setiap file yang dimuat, sehingga dua versi dunia dapat dibandingkan dengan alat pembanding teks biasa.

Pertanyaan yang sering diajukan

Apakah ada spesifikasi NBT resmi?

Tidak ada spesifikasi formal dari Mojang. Format ini didokumentasikan oleh Notch pada 2010 dan sejak itu dipelihara oleh komunitas; id tag dan tata letak pada halaman ini sesuai dengan yang dibaca dan ditulis gim saat ini.

Mengapa Bedrock memakai little-endian?

Engine Bedrock menggunakan C++ dan ditujukan untuk perangkat keras little-endian, sehingga nilai disimpan dalam urutan byte bawaan perangkat. Serialisasi Java memakai big-endian karena itulah yang ditetapkan oleh kontrak DataOutput Java.

Apa itu pengodean varint zigzag?

Cara menulis integer dengan byte sesedikit mungkin sambil menjaga bilangan negatif tetap pendek: tanda dimasukkan ke bit rendah, sehingga −1 dikodekan sebagai 1 dan 1 sebagai 2. Protokol Bedrock memakainya untuk int dan long.

Bisakah TAG_List menyimpan tipe campuran?

Tidak. Satu list mendeklarasikan satu tipe elemen dan setiap entri harus sesuai. Data campuran memerlukan list berisi compound.

Berapa panjang maksimum string?

65535 byte pada pengodean lebar tetap karena field panjang berupa unsigned short. Pengodean jaringan varint tidak memiliki batas praktis.

Alat terkait