From 5737c9356804600a448af793222cc267e3927378 Mon Sep 17 00:00:00 2001 From: shenjack <3695888@qq.com> Date: Sat, 13 Jan 2024 00:06:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=98=E6=98=AF=E7=9B=B4=E6=8E=A5=E7=94=A8?= =?UTF-8?q?=20Vec=20=E7=9A=84=20unsafe=20=E6=96=B9=E6=B3=95=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2/src/data_struct.rs | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/v2/src/data_struct.rs b/v2/src/data_struct.rs index eb53d5a..567bce7 100644 --- a/v2/src/data_struct.rs +++ b/v2/src/data_struct.rs @@ -96,50 +96,54 @@ pub mod raw_reading { slice.iter().map(|&x| x as i8).collect::>() } /// unsafe 从这里开始 - pub fn slice_as_short_array(slice: &[u8]) -> Option<&[i16]> { + pub fn slice_as_short_array(slice: &[u8]) -> Option> { let length = if slice.len() % 2 != 0 { return None; } else { (slice.len() / 2) as usize }; - Some(unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const i16, length) }) + Some(unsafe { + Vec::from_raw_parts(slice.as_ptr() as *mut i16, length, length) + }) } /// 开始 unsafe 了 /// unsafe rust, 小子! - pub fn slice_as_int_array(slice: &[u8]) -> Option<&[i32]> { + pub fn slice_as_int_array(slice: &[u8]) -> Option> { let length = if slice.len() % 4 != 0 { return None; } else { (slice.len() / 4) as usize }; - Some(unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const i32, length) }) + Some(unsafe { + Vec::from_raw_parts(slice.as_ptr() as *mut i32, 4, length) + }) } /// 这边也是 unsafe 捏 - pub fn slice_as_long_array(slice: &[u8]) -> Option<&[i64]> { + pub fn slice_as_long_array(slice: &[u8]) -> Option> { let length = if slice.len() % 8 != 0 { return None; } else { (slice.len() / 8) as usize }; - Some(unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const i64, length) }) + Some(unsafe { Vec::from_raw_parts(slice.as_ptr() as *mut i64, 8, length) }) } /// 这边也是 unsafe 捏 - pub fn slice_as_float_array(slice: &[u8]) -> Option<&[f32]> { + pub fn slice_as_float_array(slice: &[u8]) -> Option> { let length = if slice.len() % 4 != 0 { return None; } else { (slice.len() / 4) as usize }; - Some(unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const f32, length) }) + Some(unsafe { Vec::from_raw_parts(slice.as_ptr() as *mut f32, 4, length) }) } /// 这边也是 unsafe 捏 - pub fn slice_as_double_array(slice: &[u8]) -> Option<&[f64]> { + pub fn slice_as_double_array(slice: &[u8]) -> Option> { let length = if slice.len() % 8 != 0 { return None; } else { (slice.len() / 8) as usize }; - Some(unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const f64, length) }) + Some(unsafe { Vec::from_raw_parts(slice.as_ptr() as *mut f64, 8, length) }) } } @@ -223,28 +227,28 @@ impl<'value> Value<'value> { } 2 => { let raw_data = data.read_bytes(length as usize * 2); - let list = raw_reading::slice_as_short_array(raw_data.as_slice()).unwrap().to_vec(); + let list = raw_reading::slice_as_short_array(raw_data.as_slice()).unwrap(); Self::List(ListContent::ShortList(list)) } 3 => { let raw_data = data.read_bytes(length as usize * 4); - let list = raw_reading::slice_as_int_array(raw_data.as_slice()).unwrap().to_vec(); + let list = raw_reading::slice_as_int_array(raw_data.as_slice()).unwrap(); Self::List(ListContent::IntList(list)) } 4 => { let raw_data = data.read_bytes(length as usize * 8); - let list = raw_reading::slice_as_long_array(raw_data.as_slice()).unwrap().to_vec(); + let list = raw_reading::slice_as_long_array(raw_data.as_slice()).unwrap(); Self::List(ListContent::LongList(list)) } 5 => { let raw_data = data.read_bytes(length as usize * 4); - let list = raw_reading::slice_as_float_array(raw_data.as_slice()).unwrap().to_vec(); + let list = raw_reading::slice_as_float_array(raw_data.as_slice()).unwrap(); Self::List(ListContent::FloatList(list)) } 6 => { let raw_data = data.read_bytes(length as usize * 8); let list = - raw_reading::slice_as_double_array(raw_data.as_slice()).unwrap().to_vec(); + raw_reading::slice_as_double_array(raw_data.as_slice()).unwrap(); Self::List(ListContent::DoubleList(list)) } 7 => { @@ -286,7 +290,7 @@ impl<'value> Value<'value> { let length = data.read_int(); let raw_data = data.read_bytes(length as usize * 4); let value = - raw_reading::slice_as_int_array(raw_data.as_slice()).unwrap().to_vec(); + raw_reading::slice_as_int_array(raw_data.as_slice()).unwrap(); list.push(value); } Self::List(ListContent::IntArrayList(list)) @@ -297,7 +301,7 @@ impl<'value> Value<'value> { let length = data.read_int(); let raw_data = data.read_bytes(length as usize * 8); let value = - raw_reading::slice_as_long_array(raw_data.as_slice()).unwrap().to_vec(); + raw_reading::slice_as_long_array(raw_data.as_slice()).unwrap(); list.push(value); } Self::List(ListContent::LongArrayList(list))