SNBT (Stringified NBT) は NBT を人が読める文字列で表したものです。
コマンドの /give や /data で使われる記法です。
{Name:"minecraft:oak_stairs",Count:1b,tag:{Damage:0}}
コード例は基準実装の C#。 他言語での綴りは API 対応表。
// 文字列 -> タグ
NbtTag tag = Snbt.Parse("{a:1b,b:[1,2,3]}");
// タグ -> 文字列
string oneLine = Snbt.Write(tag);
string pretty = Snbt.WritePretty(tag);WritePretty は改行とインデントを入れます。
Write は 1 行に詰める。どちらも全言語で 1 バイトも違わない出力になります。
数値はどの型なのかを接尾辞で表します。
| 接尾辞 | 型 | 例 |
|---|---|---|
b / B |
TAG_Byte |
1b |
s / S |
TAG_Short |
1s |
| なし(整数) | TAG_Int |
1 |
l / L |
TAG_Long |
1l |
f / F |
TAG_Float |
1.0f |
d / D / なし(小数) |
TAG_Double |
1.0 |
配列は先頭に型を書きます。
[B;1b,2b] TAG_Byte_Array
[I;1,2,3] TAG_Int_Array
[L;1l,2l] TAG_Long_Array
[1,2,3] TAG_List(要素は TAG_Int)
新しい構文にも対応しています。
0x1F 16進リテラル
0b1010 2進リテラル
1_000_000 桁区切り
.5 先頭の 0 を省いた小数
2e3 指数表記
+5 / -5 符号
true/false bool(TAG_Byte の 1 / 0 になる)
{a:1,} 末尾のカンマ
0xFFb の b は 16 進の数字なのか TAG_Byte の印なのか区別できません。
そこで 16 進・2 進リテラルでは s / S / l / L だけを型の接尾辞として認めます。
b / d / f は数字として読みます(spec/11 2.1)。
Infinity -Infinity NaN
これらは SNBT で読み書きできるが、Minecraft 自身は受け付けないことがあります。 ワールドへ書き込む用途には使わないでください。
全言語で同じ入力から同じ文字列が出るよう、次を仕様で固定しています。
言語ごとの既定の書式(C# の R、Java の Double.toString、
JavaScript の toString…)は微妙に違います。
そこで元の値へ正確に戻る最短の 10 進表記を自前で求めている
(spec/11 5.1)。
0.1f -> 0.1f (0.10000000149011612f にはしない)
-0.0 -> -0.0 (符号を落とさない)
- 文字列は原則
"で囲む "を含み'を含まないときだけ'で囲む- 正しいサロゲートペア(絵文字など)はそのまま出す
- 孤立サロゲートだけを
\uXXXXでエスケープする
[A-Za-z0-9_.+-] だけからなるキーは引用しない。それ以外は引用します。
SNBT にはコマンド用の拡張(bool()、uuid() など)があるが、
バイナリ NBT へ一意に写せるものだけを対象にしている
(adr/0006)。
- 01. NBT の読み書き
- 仕様 11: SNBT — EBNF 文法と正準表記の算法