مرجع تنسيق NBT

يدعم Minecraft Bedrock Edition وJava Edition — وجميع برمجيات الخوادم لكليهما، الشائعة والنادرة: Vanilla, Paper, Spigot, Purpur, Folia, Fabric, Forge, NeoForge, Mohist, Sponge, Bedrock Dedicated Server, PocketMine-MP, Nukkit, PowerNukkitX, Cloudburst, Dragonfly, Endstone, LeviLamina وغيرها. القائمة الكاملة.

NBT (Named Binary Tag) هو تنسيق Minecraft الشجري الثنائي: يتكون الوسم من نوع بطول بايت واحد، واسم مسبوق بطوله، وحمولة، وتتداخل المركبات حتى يغلقها بايت TAG_End. توجد 13 نوعًا من الوسوم وخمسة ترميزات متداولة في Java وBedrock. توثق هذه الصفحة جميعها، ويتيح لك المحرر أعلاه التحقق من أي معلومة باستخدام ملف حقيقي.

13 نوعًا من الوسومكبير النهايةصغير النهايةVarintgzipzlibSNBT

أفلت أي ملف NBT لفحصه هنا

level.dat · .nbt · .mcstructure · .schem · .schematic · .dat · بيانات مقاطع مستخرجة

أنواع الوسوم الـ13

المعرّفالوسمالحمولةSNBT
0TAG_Endلا شيء — يغلق مركبًا—
1TAG_Byte1 بايت، عدد بإشارة من −128 إلى 1271b
2TAG_Short2 بايت، بإشارة1s
3TAG_Int4 بايت، بإشارة1
4TAG_Long8 بايت، بإشارة1L
5TAG_Float4 بايت، IEEE 7541.0f
6TAG_Double8 بايت، IEEE 7541.0d
7TAG_Byte_Arrayطول من نوع int، ثم هذا العدد من البايتات[B;1b,2b]
8TAG_Stringطول من نوع short بلا إشارة، ثم بايتات UTF-8"text"
9TAG_Listبايت لنوع العنصر، وطول من نوع int، ثم حمولات بلا أسماء[1,2]
10TAG_Compoundنوع + اسم + حمولة، تتكرر حتى TAG_End{a:1}
11TAG_Int_Arrayطول من نوع int، ثم هذا العدد من أعداد int ذات 4 بايت[I;1,2]
12TAG_Long_Arrayطول من نوع int، ثم هذا العدد من أعداد long ذات 8 بايت[L;1L,2L]

يتكون الملف من TAG_Compound جذري واحد: بايت نوع واحد 0x0A، ثم اسم، ثم محتويات المركب. لا تظهر الوسوم المسماة إلا داخل المركبات؛ أما عناصر القوائم فتحمل الحمولات فقط، ولهذا تكون القائمة متجانسة.

خمسة ترميزات مستخدمة فعليًا

الترميزالأعداد الصحيحةطول السلسلةالجذريُستخدم في
Java (الكلاسيكي)بعرض ثابت وبترتيب كبير النهاية2 بايت بترتيب كبير النهايةمسمىعوالم Java والبُنى والمخططات
شبكة Java (1.20.2+)بعرض ثابت وبترتيب كبير النهاية2 بايت بترتيب كبير النهايةبلا اسمبروتوكول Java
Bedrockبعرض ثابت وبترتيب صغير النهاية2 بايت بترتيب صغير النهايةمسمىعوالم Bedrock وملفات .mcstructure وقيم LevelDB
Bedrock level.datبعرض ثابت وبترتيب صغير النهاية2 بايت بترتيب صغير النهايةمسمى، بعد ترويسة من 8 بايتبيانات تعريف عالم Bedrock
شبكة BedrockZigzag varint لأعداد int وlongvarint بلا إشارةمسمىبروتوكول Bedrock

في ترميز varint، تبقى TAG_Short وTAG_Float وTAG_Double بعرض ثابت وبترتيب صغير النهاية؛ وحدهما TAG_Int وTAG_Long يتحولان إلى zigzag varints، وتتبع أطوال المصفوفات والقوائم الطريقة التي يستخدمها TAG_Int. أطوال السلاسل هي varints بلا إشارة، وهذا يزيل أيضًا حد 65535 بايت الذي تفرضه الترميزات ثابتة العرض.

السلاسل: UTF-8 المعدّل مقابل UTF-8

تسلسل Java السلاسل باستخدام DataOutputStream.writeUTF، وهو UTF-8 معدّل: يُكتب محرف NUL على هيئة C0 80 بدلًا من 00، وتُكتب المحارف خارج المستوى الأساسي متعدد اللغات كنصفين بديلين من ثلاثة بايتات (CESU-8) بدلًا من تسلسل واحد من أربعة بايتات. يستخدم Bedrock ترميز UTF-8 القياسي. الأداة التي تفترض ترميزًا واحدًا للنسختين ستفسد الرموز التعبيرية وبعض النصوص الصينية واليابانية والكورية عند الحفظ؛ يرمّز هذا المحرر وفق تنسيق الملف، ولذلك يبقى اسم العالم الذي يحتوي رمزًا تعبيريًا سليمًا بعد فتحه وحفظه هنا.

الضغط

لا يكون NBT نفسه مضغوطًا؛ فالحاوية هي التي تحدد ذلك. تكون ملفات Java عادةً مضغوطة باستخدام gzip (البصمة 1F 8B)، وتستخدم حمولات المقاطع داخل ملفات المناطق zlib (البصمة 78 01 أو 78 9C أو 78 DA)، بينما يخزن Bedrock ملف level.dat وملفات البُنى بلا ضغط. يجري الكشف بواسطة بايتات البصمة، لذا يعالج المحلل نفسه الأنواع الثلاثة؛ وحفظ ملف بالضغط الخطأ هو السبب الأكثر شيوعًا لعدم تحميل عالم عُدّل يدويًا.

ملف بسيط، بايتًا بعد بايت

ملف hello_world.nbt القياسي: مركب جذري اسمه hello world يحتوي وسم سلسلة واحدًا اسمه name وقيمته Bananrama. في ترميز 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

تختلف الوثيقة نفسها في ترميز Bedrock صغير النهاية فقط في ترتيب بايتات حقلي الطول: 0B 00 بدلًا من 00 0B. في NBT الشبكي لـBedrock تصبح الأطوال بايتات varint مفردة، 0B و04، من دون أي حشو. ضع أيًا من الملفات الثلاثة في المحرر أعلاه وسيحدد الترميز الذي استلمه.

SNBT

SNBT هو NBT مكتوب كنص، وهو ما تستخدمه الأوامر: /data merge entity @s {Invulnerable:1b}. تحافظ لواحق الأنواع على البيانات دون فقد: b لـbyte، وs لـshort، وL لـlong، وf لـfloat، وd لـdouble، ومن دون لاحقة لـint؛ وتُكتب مصفوفات الأنواع هكذا: [B;…] و[I;…] و[L;…]. يصدّر المحرر SNBT من أي ملف محمّل، مما يتيح مقارنة نسختين من العالم باستخدام أداة عادية لمقارنة النصوص.

الأسئلة الشائعة

هل توجد مواصفة رسمية لتنسيق NBT؟

لا توجد مواصفة رسمية من Mojang. وثّق Notch التنسيق في 2010، وتولى المجتمع صيانته منذ ذلك الحين؛ وتتطابق معرّفات الوسوم وتخطيطها في هذه الصفحة مع ما تقرؤه اللعبة وتكتبه حاليًا.

لماذا يستخدم Bedrock ترتيب صغير النهاية؟

محرك Bedrock مكتوب بلغة C++ ويستهدف عتادًا بترتيب صغير النهاية، لذلك يخزن القيم بترتيبها الأصلي. أما تسلسل Java فهو كبير النهاية لأن عقد Java DataOutput يحدد ذلك.

ما ترميز zigzag varint؟

هو أسلوب لكتابة الأعداد الصحيحة بأقل عدد ممكن من البايتات مع إبقاء الأعداد السالبة قصيرة: تُدمج الإشارة في البت الأقل أهمية، فيُرمّز −1 إلى 1 ويُرمّز 1 إلى 2. يستخدمه بروتوكول Bedrock لأعداد int وlong.

هل يمكن أن تحتوي TAG_List أنواعًا مختلفة؟

لا. تعلن القائمة نوعًا واحدًا للعناصر، ويجب أن يطابقه كل إدخال. تتطلب البيانات المختلطة قائمة من المركبات.

ما الحد الأقصى لطول السلسلة؟

65535 بايت في الترميزات ثابتة العرض، لأن حقل الطول هو short بلا إشارة. لا يفرض ترميز varint الشبكي حدًا عمليًا.

أدوات مرتبطة