Compare commits

..

2 Commits

2 changed files with 54 additions and 5 deletions

View File

@ -7,3 +7,24 @@ writen in rust!
感谢 @神楽坂柚咲/伊欧/langyo 感谢 @神楽坂柚咲/伊欧/langyo
在编写过程中的帮助( 在编写过程中的帮助(
## 概况
- `shen-nbt1`
- 几周的技术积累
- 100 mb/s
- `shen-nbt2`
- 2个月的技术积累
- 500 mb/s
- `shen-nbt3/4`
- 半年的技术积累
- v3 有单一依赖库
- v4 无依赖库
- 2000 mb/s
- `shen-nbt5` (编写中)
- 一年左右的技术积累
- 4000 mb/s ?
- 支持 `serde` 序列化/反序列化

View File

@ -61,15 +61,41 @@ impl NbtReader<'_> {
read!(read_u64, u64, 8); read!(read_u64, u64, 8);
read!(read_f32, f32, 4, false); read!(read_f32, f32, 4, false);
read!(read_f64, f64, 8, false); read!(read_f64, f64, 8, false);
pub fn read_bytes(&mut self, len: usize) -> &[u8] {
pub fn read_u8_array(&mut self, len: usize) -> &[u8] {
let value = &self.data[self.cursor..self.cursor + len]; let value = &self.data[self.cursor..self.cursor + len];
self.cursor += len; self.cursor += len;
value value
} }
pub fn read_i8_array(&mut self, len: usize) -> &[i8] {
let value = unsafe {
std::slice::from_raw_parts(self.data[self.cursor..].as_ptr() as *const i8, len)
};
self.cursor += len;
value
}
pub fn read_string(&mut self, len: usize) -> String {
let value = String::from_utf8_lossy(&self.data[self.cursor..self.cursor + len]);
self.cursor += len;
value.into_owned()
}
pub fn read_int_array(&mut self, len: usize) -> &[i32] {
let datas = self.read_u8_array(len * 4);
let value = unsafe {
std::slice::from_raw_parts(datas.as_ptr() as *const i32, len)
};
}
pub fn read_long_array(&mut self, len: usize) -> &[i64] {
let datas = self.read_u8_array(len * 8);
let value = unsafe {
std::slice::from_raw_parts(datas.as_ptr() as *const i64, len)
};
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum NbtValue<'value> { pub enum NbtValue {
// end: 0 // end: 0
/// 1: Byte /// 1: Byte
Byte(i8), Byte(i8),
@ -87,13 +113,15 @@ pub enum NbtValue<'value> {
ByteArray(Vec<i8>), ByteArray(Vec<i8>),
/// 8 /// 8
/// 或者叫 u8 array /// 或者叫 u8 array
String(&'value str), String(String),
/// 9 /// 9
List(Vec<NbtValue<'value>>), List(Vec<NbtValue>),
/// 10 /// 10
Compound(Vec<(String, NbtValue<'value>)>), Compound(Vec<(String, NbtValue)>),
/// 11 /// 11
IntArray(Vec<i32>), IntArray(Vec<i32>),
/// 12 /// 12
LongArray(Vec<i64>), LongArray(Vec<i64>),
} }