#nbt #minecraft #bedrock #read-write

zuri_nbt

读取和写入Minecraft NBT数据

1个不稳定版本

0.3.0 2023年7月14日

#2109编码

MIT 协议

110KB
2.5K SLoC

概述

读取和写入NBT数据。

命名二进制标签(NBT)是一种结构化二进制格式,在Minecraft中被广泛用于多种用途。这个crate主要关注Minecraft: Bedrock Edition,并支持小端网络小端编码。虽然Minecraft: Java Edition更常用到的是大端编码,但该crate也支持。

特性标志

  • serde - 允许使用serde将Rust类型序列化和反序列化为NBT。

示例

NBT数据可以按照以下方式构建和写入

use std::collections::HashMap;
use bytes::BytesMut;
use zuri_nbt::encoding::LittleEndian;
use zuri_nbt::NBTTag;

let mut nbt = HashMap::new();
nbt.insert("name".to_string(), NBTTag::String("Zuri".to_string().into()));
nbt.insert("age".to_string(), NBTTag::Int(18.into()));

let mut buf = BytesMut::new();
NBTTag::Compound(nbt.into()).write(&mut buf, &mut LittleEndian)
    .expect("Something went wrong while writing nbt");

读取NBT数据可以按照以下方式完成

use bytes::Bytes;
use zuri_nbt::encoding::LittleEndian;
use zuri_nbt::NBTTag;

let mut buf = Bytes::from([
   0x08, 0x00, 0x00, 0x0c,
   0x00, 0x48, 0x65, 0x6c,
   0x6c, 0x6f, 0x20, 0x57,
   0x6f, 0x72, 0x6c, 0x64,
   0x21, 0x00, 0x00, 0x00,
].as_ref());

let value = NBTTag::read(&mut buf, &mut LittleEndian)
   .expect("Something went wrong while reading nbt");
assert_eq!(value, NBTTag::String("Hello World!".to_string().into()));

依赖

~0.5–1MB
~23K SLoC