NBT (Named Binary Tag) هو تنسيق Minecraft الشجري الثنائي: يتكون الوسم من نوع بطول بايت واحد، واسم مسبوق بطوله، وحمولة، وتتداخل المركبات حتى يغلقها بايت TAG_End. توجد 13 نوعًا من الوسوم وخمسة ترميزات متداولة في Java وBedrock. توثق هذه الصفحة جميعها، ويتيح لك المحرر أعلاه التحقق من أي معلومة باستخدام ملف حقيقي.
13 نوعًا من الوسومكبير النهايةصغير النهايةVarintgzipzlibSNBT
بايت لنوع العنصر، وطول من نوع int، ثم حمولات بلا أسماء
[1,2]
10
TAG_Compound
نوع + اسم + حمولة، تتكرر حتى TAG_End
{a:1}
11
TAG_Int_Array
طول من نوع int، ثم هذا العدد من أعداد int ذات 4 بايت
[I;1,2]
12
TAG_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
شبكة Bedrock
Zigzag varint لأعداد int وlong
varint بلا إشارة
مسمى
بروتوكول 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 الشبكي حدًا عمليًا.