use std::mem; use std::mem::size_of; pub fn transmute_to_u8_slice(v: &[T]) -> &[u8] { unsafe { std::slice::from_raw_parts(v.as_ptr().cast::(), mem::size_of_val(v)) } } pub fn transmute_from_u8_to_slice(data: &[u8]) -> &[T] { debug_assert_eq!(data.len() % size_of::(), 0); assert_eq!( data.as_ptr().align_offset(mem::align_of::()), 0, "transmuting byte slice 0x{:p} into slice of {}: \ required alignment is {} bytes, \ byte slice misaligned by {} bytes", data.as_ptr(), std::any::type_name::(), mem::align_of::(), data.as_ptr().align_offset(mem::align_of::()), ); let len = data.len() / size_of::(); let ptr = data.as_ptr().cast::(); unsafe { std::slice::from_raw_parts(ptr, len) } }