mojang就是有毛病
This commit is contained in:
parent
00c0121940
commit
f05ea5814d
@ -6,3 +6,7 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = []
|
||||||
|
debug = []
|
||||||
|
13
src/data.rs
13
src/data.rs
@ -9,7 +9,7 @@ pub type NbtLength = i32;
|
|||||||
|
|
||||||
/// NBT 里的字符串独树一帜的把自己的长度用一个u32表示
|
/// NBT 里的字符串独树一帜的把自己的长度用一个u32表示
|
||||||
/// 不如说为啥别的不用 u32 呢
|
/// 不如说为啥别的不用 u32 呢
|
||||||
pub type StringLength = u32;
|
pub type StringLength = u16;
|
||||||
|
|
||||||
/// Reader
|
/// Reader
|
||||||
pub type Reader<'a> = Cursor<&'a [u8]>;
|
pub type Reader<'a> = Cursor<&'a [u8]>;
|
||||||
@ -112,7 +112,9 @@ impl From<Vec<NbtItem>> for NbtList {
|
|||||||
|
|
||||||
impl From<HashMap<Arc<str>, NbtItem>> for NbtList {
|
impl From<HashMap<Arc<str>, NbtItem>> for NbtList {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(value: HashMap<Arc<str>, NbtItem>) -> Self { Self::Compound(Rc::new(RefCell::new(value))) }
|
fn from(value: HashMap<Arc<str>, NbtItem>) -> Self {
|
||||||
|
Self::Compound(Rc::new(RefCell::new(value)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Vec<bool>> for NbtList {
|
impl From<Vec<bool>> for NbtList {
|
||||||
@ -194,13 +196,16 @@ impl NbtValue {
|
|||||||
|
|
||||||
/// 直接读取
|
/// 直接读取
|
||||||
pub fn from_string(value: &mut Reader) -> Self {
|
pub fn from_string(value: &mut Reader) -> Self {
|
||||||
let len: StringLength = Self::from_i32(value).as_i32().unwrap() as StringLength;
|
let len: StringLength = Self::from_i16(value).as_i16().unwrap() as StringLength;
|
||||||
if len == 0 {
|
if len == 0 {
|
||||||
return Self::String(Arc::from(""));
|
return Self::String(Arc::from(""));
|
||||||
}
|
}
|
||||||
let mut buff = vec![0_u8; len as usize];
|
let mut buff = vec![0_u8; len as usize];
|
||||||
_ = value.read(&mut buff).unwrap();
|
_ = value.read(&mut buff).unwrap();
|
||||||
Self::String(Arc::from(String::from_utf8(buff).unwrap()))
|
let str = Arc::from(String::from_utf8(buff).unwrap());
|
||||||
|
#[cfg(feature = "debug")]
|
||||||
|
println!("-----string len: {} value: |{}|", len, str);
|
||||||
|
Self::String(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 读取一个有类型无名称的值 (List)
|
/// 读取一个有类型无名称的值 (List)
|
||||||
|
118
src/main.rs
118
src/main.rs
@ -1,9 +1,127 @@
|
|||||||
|
#![feature(buf_read_has_data_left)]
|
||||||
|
|
||||||
mod data;
|
mod data;
|
||||||
mod read;
|
mod read;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
println!("Hello, world!");
|
||||||
|
big_read_test();
|
||||||
}
|
}
|
||||||
|
|
||||||
// bincode-org/bincode: A binary encoder / decoder implementation in Rust.
|
// bincode-org/bincode: A binary encoder / decoder implementation in Rust.
|
||||||
// https://github.com/bincode-org/bincode
|
// https://github.com/bincode-org/bincode
|
||||||
|
|
||||||
|
fn big_read_test() {
|
||||||
|
let data: [u8; 0x21] = [
|
||||||
|
0x0A, 0x00, 0x0B, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x08, 0x00,
|
||||||
|
0x04, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x09, 0x42, 0x61, 0x6E, 0x61, 0x6E, 0x72, 0x61, 0x6D, 0x61,
|
||||||
|
0x00 ];
|
||||||
|
read_test(&data);
|
||||||
|
|
||||||
|
let data: [u8; 0x608] = [
|
||||||
|
0x0A, 0x00, 0x05, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x04, 0x00, 0x08, 0x6C, 0x6F, 0x6E, 0x67, 0x54,
|
||||||
|
0x65, 0x73, 0x74, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x09, 0x73, 0x68,
|
||||||
|
0x6F, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, 0x7F, 0xFF, 0x08, 0x00, 0x0A, 0x73, 0x74, 0x72, 0x69,
|
||||||
|
0x6E, 0x67, 0x54, 0x65, 0x73, 0x74, 0x00, 0x29, 0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x20, 0x57, 0x4F,
|
||||||
|
0x52, 0x4C, 0x44, 0x20, 0x54, 0x48, 0x49, 0x53, 0x20, 0x49, 0x53, 0x20, 0x41, 0x20, 0x54, 0x45,
|
||||||
|
0x53, 0x54, 0x20, 0x53, 0x54, 0x52, 0x49, 0x4E, 0x47, 0x20, 0xC3, 0x85, 0xC3, 0x84, 0xC3, 0x96,
|
||||||
|
0x21, 0x05, 0x00, 0x09, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x3E, 0xFF, 0x18,
|
||||||
|
0x32, 0x03, 0x00, 0x07, 0x69, 0x6E, 0x74, 0x54, 0x65, 0x73, 0x74, 0x7F, 0xFF, 0xFF, 0xFF, 0x0A,
|
||||||
|
0x00, 0x14, 0x6E, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x6F, 0x75, 0x6E,
|
||||||
|
0x64, 0x20, 0x74, 0x65, 0x73, 0x74, 0x0A, 0x00, 0x03, 0x68, 0x61, 0x6D, 0x08, 0x00, 0x04, 0x6E,
|
||||||
|
0x61, 0x6D, 0x65, 0x00, 0x06, 0x48, 0x61, 0x6D, 0x70, 0x75, 0x73, 0x05, 0x00, 0x05, 0x76, 0x61,
|
||||||
|
0x6C, 0x75, 0x65, 0x3F, 0x40, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x65, 0x67, 0x67, 0x08, 0x00,
|
||||||
|
0x04, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x07, 0x45, 0x67, 0x67, 0x62, 0x65, 0x72, 0x74, 0x05, 0x00,
|
||||||
|
0x05, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x6C,
|
||||||
|
0x69, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x20, 0x28, 0x6C, 0x6F, 0x6E, 0x67, 0x29, 0x04, 0x00,
|
||||||
|
0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x09, 0x00, 0x13, 0x6C, 0x69,
|
||||||
|
0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x20, 0x28, 0x63, 0x6F, 0x6D, 0x70, 0x6F, 0x75, 0x6E, 0x64,
|
||||||
|
0x29, 0x0A, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x0F, 0x43,
|
||||||
|
0x6F, 0x6D, 0x70, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x74, 0x61, 0x67, 0x20, 0x23, 0x30, 0x04, 0x00,
|
||||||
|
0x0A, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2D, 0x6F, 0x6E, 0x00, 0x00, 0x01, 0x26, 0x52,
|
||||||
|
0x37, 0xD5, 0x8D, 0x00, 0x08, 0x00, 0x04, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x0F, 0x43, 0x6F, 0x6D,
|
||||||
|
0x70, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x74, 0x61, 0x67, 0x20, 0x23, 0x31, 0x04, 0x00, 0x0A, 0x63,
|
||||||
|
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2D, 0x6F, 0x6E, 0x00, 0x00, 0x01, 0x26, 0x52, 0x37, 0xD5,
|
||||||
|
0x8D, 0x00, 0x01, 0x00, 0x08, 0x62, 0x79, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x7F, 0x07, 0x00,
|
||||||
|
0x65, 0x62, 0x79, 0x74, 0x65, 0x41, 0x72, 0x72, 0x61, 0x79, 0x54, 0x65, 0x73, 0x74, 0x20, 0x28,
|
||||||
|
0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x31, 0x30, 0x30, 0x30, 0x20, 0x76,
|
||||||
|
0x61, 0x6C, 0x75, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x28, 0x6E, 0x2A, 0x6E, 0x2A, 0x32, 0x35,
|
||||||
|
0x35, 0x2B, 0x6E, 0x2A, 0x37, 0x29, 0x25, 0x31, 0x30, 0x30, 0x2C, 0x20, 0x73, 0x74, 0x61, 0x72,
|
||||||
|
0x74, 0x69, 0x6E, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6E, 0x3D, 0x30, 0x20, 0x28, 0x30,
|
||||||
|
0x2C, 0x20, 0x36, 0x32, 0x2C, 0x20, 0x33, 0x34, 0x2C, 0x20, 0x31, 0x36, 0x2C, 0x20, 0x38, 0x2C,
|
||||||
|
0x20, 0x2E, 0x2E, 0x2E, 0x29, 0x29, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A,
|
||||||
|
0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02,
|
||||||
|
0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36,
|
||||||
|
0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42,
|
||||||
|
0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26,
|
||||||
|
0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46,
|
||||||
|
0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E,
|
||||||
|
0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E,
|
||||||
|
0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A,
|
||||||
|
0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62,
|
||||||
|
0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E,
|
||||||
|
0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16,
|
||||||
|
0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A,
|
||||||
|
0x06, 0x30, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56,
|
||||||
|
0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A,
|
||||||
|
0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A,
|
||||||
|
0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52,
|
||||||
|
0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22,
|
||||||
|
0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E,
|
||||||
|
0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12,
|
||||||
|
0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32,
|
||||||
|
0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A,
|
||||||
|
0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E,
|
||||||
|
0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06,
|
||||||
|
0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E,
|
||||||
|
0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A,
|
||||||
|
0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02,
|
||||||
|
0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36,
|
||||||
|
0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42,
|
||||||
|
0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26,
|
||||||
|
0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46,
|
||||||
|
0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E,
|
||||||
|
0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E,
|
||||||
|
0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A,
|
||||||
|
0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62,
|
||||||
|
0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E,
|
||||||
|
0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16,
|
||||||
|
0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A,
|
||||||
|
0x06, 0x30, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56,
|
||||||
|
0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A,
|
||||||
|
0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A,
|
||||||
|
0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52,
|
||||||
|
0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22,
|
||||||
|
0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E,
|
||||||
|
0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12,
|
||||||
|
0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32,
|
||||||
|
0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A,
|
||||||
|
0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E,
|
||||||
|
0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06,
|
||||||
|
0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E,
|
||||||
|
0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E, 0x22, 0x10, 0x08, 0x0A,
|
||||||
|
0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E, 0x2E, 0x58, 0x28, 0x02,
|
||||||
|
0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A, 0x12, 0x14, 0x20, 0x36,
|
||||||
|
0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62, 0x32, 0x0C, 0x54, 0x42,
|
||||||
|
0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E, 0x2A, 0x40, 0x60, 0x26,
|
||||||
|
0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16, 0x5E, 0x4C, 0x44, 0x46,
|
||||||
|
0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A, 0x06, 0x30, 0x00, 0x3E,
|
||||||
|
0x22, 0x10, 0x08, 0x0A, 0x16, 0x2C, 0x4C, 0x12, 0x46, 0x20, 0x04, 0x56, 0x4E, 0x50, 0x5C, 0x0E,
|
||||||
|
0x2E, 0x58, 0x28, 0x02, 0x4A, 0x38, 0x30, 0x32, 0x3E, 0x54, 0x10, 0x3A, 0x0A, 0x48, 0x2C, 0x1A,
|
||||||
|
0x12, 0x14, 0x20, 0x36, 0x56, 0x1C, 0x50, 0x2A, 0x0E, 0x60, 0x58, 0x5A, 0x02, 0x18, 0x38, 0x62,
|
||||||
|
0x32, 0x0C, 0x54, 0x42, 0x3A, 0x3C, 0x48, 0x5E, 0x1A, 0x44, 0x14, 0x52, 0x36, 0x24, 0x1C, 0x1E,
|
||||||
|
0x2A, 0x40, 0x60, 0x26, 0x5A, 0x34, 0x18, 0x06, 0x62, 0x00, 0x0C, 0x22, 0x42, 0x08, 0x3C, 0x16,
|
||||||
|
0x5E, 0x4C, 0x44, 0x46, 0x52, 0x04, 0x24, 0x4E, 0x1E, 0x5C, 0x40, 0x2E, 0x26, 0x28, 0x34, 0x4A,
|
||||||
|
0x06, 0x30, 0x06, 0x00, 0x0A, 0x64, 0x6F, 0x75, 0x62, 0x6C, 0x65, 0x54, 0x65, 0x73, 0x74, 0x3F,
|
||||||
|
0xDF, 0x8F, 0x6B, 0xBB, 0xFF, 0x6A, 0x5E, 0x00 ];
|
||||||
|
read_test(&data);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_test(data: &[u8]) {
|
||||||
|
let cursor: std::io::Cursor<&[u8]> = std::io::Cursor::new(data);
|
||||||
|
println!("data: {:?}", data);
|
||||||
|
let nbt_data = data::NbtItem::try_from(cursor).unwrap();
|
||||||
|
println!("nbt_data: {:#?}", nbt_data);
|
||||||
|
}
|
||||||
|
26
src/read.rs
26
src/read.rs
@ -1,6 +1,6 @@
|
|||||||
use crate::data::{NbtItem, NbtList, NbtValue, Reader};
|
use crate::data::{NbtItem, NbtList, NbtValue, Reader};
|
||||||
use std::convert::From;
|
use std::convert::From;
|
||||||
use std::io::{Cursor, Read};
|
use std::io::{BufRead, Cursor, Read};
|
||||||
|
|
||||||
/// 输出类型标识符
|
/// 输出类型标识符
|
||||||
/// 类型标识符
|
/// 类型标识符
|
||||||
@ -164,17 +164,21 @@ pub mod read_data {
|
|||||||
// 进来直接是 values
|
// 进来直接是 values
|
||||||
// loop 读取长度 name len name value value
|
// loop 读取长度 name len name value value
|
||||||
// 直到一个 End
|
// 直到一个 End
|
||||||
|
#[cfg(feature = "debug")]
|
||||||
|
println!("reading compound {} bytes", value.position());
|
||||||
let mut map: HashMap<Arc<str>, NbtItem> = HashMap::new();
|
let mut map: HashMap<Arc<str>, NbtItem> = HashMap::new();
|
||||||
loop {
|
loop {
|
||||||
|
// 读取 name
|
||||||
|
// 直接调之前的方法读
|
||||||
|
let name = NbtValue::from_string(value).as_string().unwrap();
|
||||||
let mut type_tag = [0_u8; 1];
|
let mut type_tag = [0_u8; 1];
|
||||||
_ = value.read(&mut type_tag).unwrap();
|
_ = value.read(&mut type_tag).unwrap();
|
||||||
|
#[cfg(feature = "debug")]
|
||||||
|
println!("compound type tag {:?} with name: {:?}", type_tag, name);
|
||||||
if type_tag == [0x00] {
|
if type_tag == [0x00] {
|
||||||
// End
|
// End
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// 读取 name
|
|
||||||
// 直接调之前的方法读
|
|
||||||
let name = NbtValue::from_string(value).as_string().unwrap();
|
|
||||||
// 读取 value
|
// 读取 value
|
||||||
let nbt_value: NbtItem = match type_tag {
|
let nbt_value: NbtItem = match type_tag {
|
||||||
[0x01] => NbtItem::Value(NbtValue::from_bool(value)),
|
[0x01] => NbtItem::Value(NbtValue::from_bool(value)),
|
||||||
@ -203,6 +207,8 @@ pub mod read_data {
|
|||||||
};
|
};
|
||||||
// 读取完了,放进去
|
// 读取完了,放进去
|
||||||
map.insert(name, nbt_value);
|
map.insert(name, nbt_value);
|
||||||
|
#[cfg(feature = "debug")]
|
||||||
|
println!("compound: {:?}", map);
|
||||||
}
|
}
|
||||||
NbtList::from(map)
|
NbtList::from(map)
|
||||||
}
|
}
|
||||||
@ -229,10 +235,13 @@ impl TryFrom<Cursor<&[u8]>> for NbtItem {
|
|||||||
fn try_from(in_value: Reader) -> Result<NbtItem, Self::Error> {
|
fn try_from(in_value: Reader) -> Result<NbtItem, Self::Error> {
|
||||||
let mut value: Reader = in_value.clone();
|
let mut value: Reader = in_value.clone();
|
||||||
let mut items: Vec<NbtItem> = Vec::new();
|
let mut items: Vec<NbtItem> = Vec::new();
|
||||||
|
#[cfg(feature = "debug")]
|
||||||
|
println!("reader pos: {:?}", value.position());
|
||||||
loop {
|
loop {
|
||||||
// 读取类型
|
// 读取类型
|
||||||
let mut buff = [0_u8; 1];
|
let mut buff = [0_u8; 1];
|
||||||
_ = value.read(&mut buff).unwrap();
|
_ = value.read(&mut buff).unwrap();
|
||||||
|
let name = NbtValue::from_string(&mut value).as_string().unwrap();
|
||||||
let type_code: NbtStatus = match buff {
|
let type_code: NbtStatus = match buff {
|
||||||
[0x00] => NbtStatus::End,
|
[0x00] => NbtStatus::End,
|
||||||
[0x01] => NbtStatus::Going(NbtItem::Value(NbtValue::from_bool(&mut value))),
|
[0x01] => NbtStatus::Going(NbtItem::Value(NbtValue::from_bool(&mut value))),
|
||||||
@ -256,12 +265,21 @@ impl TryFrom<Cursor<&[u8]>> for NbtItem {
|
|||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
};
|
};
|
||||||
|
#[cfg(feature = "debug")]
|
||||||
|
println!(
|
||||||
|
"==type_code: {:?} reader pos: {:?}",
|
||||||
|
buff,
|
||||||
|
value.position()
|
||||||
|
);
|
||||||
match type_code {
|
match type_code {
|
||||||
NbtStatus::End => {
|
NbtStatus::End => {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
NbtStatus::Going(item) => {
|
NbtStatus::Going(item) => {
|
||||||
items.push(item);
|
items.push(item);
|
||||||
|
if !value.has_data_left().unwrap() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
NbtStatus::Error(e) => {
|
NbtStatus::Error(e) => {
|
||||||
return Err(e);
|
return Err(e);
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# cargo fmt config
|
# cargo fmt config
|
||||||
|
|
||||||
# 最大行长
|
# 最大行长
|
||||||
max_width = 150
|
max_width = 100
|
||||||
# 链式调用的最大长度
|
# 链式调用的最大长度
|
||||||
chain_width = 100
|
chain_width = 80
|
||||||
# 数组的最大长度
|
# 数组的最大长度
|
||||||
array_width = 100
|
array_width = 80
|
||||||
# 函数参数的最大长度
|
# 函数参数的最大长度
|
||||||
attr_fn_like_width = 100
|
attr_fn_like_width = 80
|
||||||
# 函数调用参数的最大长度
|
# 函数调用参数的最大长度
|
||||||
fn_call_width = 80
|
fn_call_width = 80
|
||||||
# 简单函数格式化为单行
|
# 简单函数格式化为单行
|
||||||
|
Loading…
Reference in New Issue
Block a user