NBT Biçimi Başvurusu

Minecraft Bedrock Edition ve Java Edition desteği — her iki sürümün yaygın veya az bilinen tüm sunucu çekirdekleriyle: Vanilla, Paper, Spigot, Purpur, Folia, Fabric, Forge, NeoForge, Mohist, Sponge, Bedrock Dedicated Server, PocketMine-MP, Nukkit, PowerNukkitX, Cloudburst, Dragonfly, Endstone, LeviLamina ve diğerleri. Tam liste.

NBT (Named Binary Tag), Minecraft’ın ikili ağaç biçimidir. Etiket; bir baytlık tür, uzunluk önekli ad ve yükten oluşur. Compound’lar bir TAG_End baytıyla kapanana kadar iç içe geçer. Java ve Bedrock’ta kullanılan 13 etiket türü ve beş kodlama vardır. Bu sayfa tümünü belgeler; yukarıdaki düzenleyici bilgileri gerçek dosyayla denetlemenizi sağlar.

13 etiket türüBig-endianLittle-endianVarintgzipzlibSNBT

incelemek için herhangi bir NBT dosyası öğesini buraya bırakın

level.dat · .nbt · .mcstructure · .schem · .schematic · .dat · chunk dökümleri

13 etiket türü

KimlikEtiketYükSNBT
0TAG_EndYok — compound’u kapatır—
1TAG_Byte1 bayt, signed −128…1271b
2TAG_Short2 bayt, signed1s
3TAG_Int4 bayt, signed1
4TAG_Long8 bayt, signed1L
5TAG_Float4 bayt, IEEE 7541.0f
6TAG_Double8 bayt, IEEE 7541.0d
7TAG_Byte_Arrayint uzunluk, ardından o kadar bayt[B;1b,2b]
8TAG_Stringunsigned short uzunluk, ardından UTF-8 baytları"text"
9TAG_Listöğe türü baytı, int uzunluk, ardından adsız yükler[1,2]
10TAG_Compoundtür + ad + yük, şu etikete kadar yinelenir: TAG_End{a:1}
11TAG_Int_Arrayint uzunluk, ardından o kadar 4 baytlık int[I;1,2]
12TAG_Long_Arrayint uzunluk, ardından o kadar 8 baytlık long[L;1L,2L]

Dosya tek bir kök TAG_Compound: bir tür baytı 0x0A, bir ad ve ardından compound içeriği gelir. Adlı etiketler yalnızca compound içinde bulunur; liste öğeleri sadece yük taşıdığı için liste tek türdedir.

Kullanılan beş kodlama

KodlamaInteger’larString uzunluğuKökKullananlar
Java (klasik)Sabit genişlikli big-endian2 baytlık big-endianAdlıJava dünyaları, yapılar, şemalar
Java ağı (1.20.2+)Sabit genişlikli big-endian2 baytlık big-endianAdsızJava protokolü
BedrockSabit genişlikli little-endian2 baytlık little-endianAdlıBedrock dünyaları, .mcstructure, LevelDB değerleri
Bedrock level.datSabit genişlikli little-endian2 baytlık little-endian8 baytlık üstbilgiden sonra adlıBedrock dünya meta verileri
Bedrock ağıint ve long için zigzag varintİşaretsiz varintAdlıBedrock protokolü

Varint kodlamasında TAG_Short, TAG_Float ve TAG_Double sabit genişlikli little-endian kalır; yalnızca TAG_Int ve TAG_Long zigzag varint olur. Dizi ve liste uzunlukları TAG_Int ile aynı kodlamayı izler. String uzunlukları unsigned varint’tir; sabit kodlamalardaki 65535 bayt sınırı böylece kalkar.

Dizeler: değiştirilmiş UTF-8 ve UTF-8

Java dizeleri DataOutputStream.writeUTF; bu değiştirilmiş UTF-8’dir. NUL karakteri C0 80 yerine 00, Temel Çok Dilli Düzlem dışındaki karakterler tek dört baytlık dizi yerine iki üç baytlık surrogate parça (CESU-8) olarak yazılır. Bedrock standart UTF-8 kullanır. Aynı kodlamayı kullanan araç emoji ve bazı CJK metinlerini bozar; bu düzenleyici biçime göre kodlar.

Sıkıştırma

NBT kendi başına sıkıştırılmaz; kapsayıcı karar verir. Java dosyaları genellikle gzip (magic 1F 8B), bölge dosyalarındaki chunk yükleri zlib’dir (magic 78 01, 78 9C veya 78 DA), Bedrock ise level.dat ve yapı dosyalarını sıkıştırmadan saklar. Algılama magic baytlarıyla yapılır; aynı ayrıştırıcı üçünü de işler. Yanlış sıkıştırmayla kaydedilen dosya, elle düzenlenen dünyanın yüklenmemesinin en yaygın nedenidir.

En küçük dosya, bayt bayt

Klasik hello_world.nbt: şu adlı kök compound hello world adlı kök compound içinde name değerli tek string etiketi Bananrama. Java big-endian kodlamasında:

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

Aynı belgenin Bedrock little-endian kodlamasında yalnızca iki uzunluk alanının bayt sırası değişir: 0B 00 yerine 00 0B. Bedrock ağ NBT’sinde uzunluklar tek varint baytı olur: 0B ve 04, hiç dolgu yoktur. Üçünden birini yukarıdaki düzenleyiciye bırakınca hangisi olduğunu bildirir.

SNBT

SNBT, NBT’nin metinle yazılmış biçimidir ve komutların kullandığı biçimdir: /data merge entity @s {Invulnerable:1b}. Tür sonekleri veriyi kayıpsız tutar: b byte, s short, L long, f float, d double; int için sonek yoktur. Türlü dizi sabitleri [B;…], [I;…], [L;…]. Düzenleyici yüklenen her dosyadan SNBT dışa aktarır; böylece dünyanın iki sürümü normal metin farkıyla karşılaştırılabilir.

Sık Sorulan Sorular

Resmî bir NBT belirtimi var mı?

Mojang tarafından yayımlanmış resmî bir belirtim yoktur. Biçim 2010’da Notch tarafından belgelenmiş, o zamandan beri toplulukça sürdürülmüştür; bu sayfadaki etiket kimlikleri ve düzen oyunun bugün okuyup yazdığı biçimle eşleşir.

Bedrock neden little-endian kullanır?

Bedrock motoru C++ ile yazılmıştır ve little-endian donanımı hedefler; değerleri yerel sırada saklar. Java serileştirmesi, Java DataOutput sözleşmesi gereği big-endian’dır.

Zigzag varint kodlaması nedir?

Negatifleri de kısa tutarak integer değerleri mümkün olan en az baytla yazma yöntemidir. İşaret düşük bite katlanır; −1, 1 olarak; 1 ise 2 olarak kodlanır. Bedrock protokolü int ve long değerlerinde kullanır.

TAG_List karışık türler içerebilir mi?

Hayır. Liste tek bir öğe türü bildirir ve her girdi bu türle eşleşmelidir. Karışık veriler compound listesi gerektirir.

Azami string uzunluğu nedir?

Uzunluk alanı unsigned short olduğu için sabit kodlamalarda 65535 bayttır. Varint ağ kodlamasında pratik bir sınır yoktur.

İlgili araçlar