From 88a2092e67d3145d9385a0a89703d6e4b3182c19 Mon Sep 17 00:00:00 2001 From: shenjack <3695888@qq.com> Date: Sat, 9 Mar 2024 17:31:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=80=E9=83=A8=E5=88=86?= =?UTF-8?q?=20from=20reader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shen-nbt5/src/lib.rs | 75 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/shen-nbt5/src/lib.rs b/shen-nbt5/src/lib.rs index 31c60e0..bda8cbf 100644 --- a/shen-nbt5/src/lib.rs +++ b/shen-nbt5/src/lib.rs @@ -1,7 +1,7 @@ -// pub enum Endian { -// Big, -// Little, -// } +pub enum Endian { + Big, + Little, +} #[cfg(test)] mod tests; @@ -297,6 +297,44 @@ impl NbtReader<'_> { self.cursor += len * 8; value } + + /// 读取一个 NBT byte array + pub fn read_nbt_i8_array(&mut self) -> Vec { + let len = self.read_i32() as usize; + let value = unsafe { + self.read_i8_array_unchecked(len) + }; + self.cursor += len; + value + } + + /// 读取一个 NBT int array + pub fn read_nbt_i32_array(&mut self) -> Vec { + let len = self.read_i32() as usize; + let value = unsafe { + self.read_i32_array_unchecked(len) + }; + self.cursor += len * 4; + value + } + + /// 读取一个 NBT long array + pub fn read_nbt_i64_array(&mut self) -> Vec { + let len = self.read_i32() as usize; + let value = unsafe { + self.read_i64_array_unchecked(len) + }; + self.cursor += len * 8; + value + } + + /// 读取一个 NBT string + pub fn read_nbt_string(&mut self) -> String { + let len = self.read_u16() as usize; + let value = self.read_string(len); + value + } + } #[derive(Debug, Clone)] @@ -315,17 +353,22 @@ pub enum NbtValue { /// 6 Double(f64), /// 7 + /// 长度: i32 ByteArray(Vec), /// 8 /// 或者叫 u8 array + /// 长度: u16 String(String), /// 9 + /// 长度: i32 List(Vec), /// 10 - Compound(Vec<(String, NbtValue)>), + Compound(Option, Vec<(String, NbtValue)>), /// 11 + /// 长度: i32 IntArray(Vec), /// 12 + /// 长度: i32 LongArray(Vec), } @@ -335,5 +378,25 @@ impl NbtValue { NbtValue::from_reader(reader) } - pub fn from_reader(reader: NbtReader) -> NbtValue { todo!() } + fn inner_read(reader: &mut NbtReader) -> NbtValue { + todo!() + } + + pub fn from_reader(mut reader: NbtReader) -> NbtValue { + // 第一个 tag, 不可能是 0 + match reader.read_u8() { + 0 => unreachable!(), + 1 => NbtValue::Byte(reader.read_i8()), + 2 => NbtValue::Short(reader.read_i16()), + 3 => NbtValue::Int(reader.read_i32()), + 4 => NbtValue::Long(reader.read_i64()), + 5 => NbtValue::Float(reader.read_f32()), + 6 => NbtValue::Double(reader.read_f64()), + 7 => NbtValue::ByteArray(reader.read_nbt_i8_array()), + 8 => NbtValue::String(reader.read_nbt_string()), + + + _ => unimplemented!() + } + } }