1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
use std::{io, mem, slice}; /// Read `T` with byte array /// /// # Example /// /// ``` /// extern crate wraited_struct; /// use std::fs::File; /// /// #[derive(Debug)] /// struct Something { /// a: u8, /// b: u16, /// c: u32, /// } /// /// fn main() { /// let mut file = File::open("something.bin").unwrap(); /// let something = wraited_struct::read::<Something, File>(&mut file).unwrap(); /// println!("{:?}", something); /// } /// ``` pub unsafe fn read<T, R: io::Read>(reader: &mut R) -> io::Result<T> { // http://stackoverflow.com/questions/25410028/how-to-read-a-struct-from-a-file-in-rust let num_bytes = mem::size_of::<T>(); let mut result: T = mem::uninitialized(); let buffer: &mut [u8] = slice::from_raw_parts_mut(&mut result as *mut T as *mut u8, num_bytes); match reader.read_exact(buffer) { Ok(()) => Ok(result), Err(e) => { mem::forget(result); Err(e) } } } /// Write `T` with byte array /// /// # Example /// /// ``` /// extern crate wraited_struct; /// use std::fs::File; /// /// struct Something { /// a: u8, /// b: u16, /// c: u32, /// } /// /// fn main() { /// let mut file = File::create("something.bin").unwrap(); /// wraited_struct::write::<Something, File>(&mut file, Something { a: 97, b: 98, c: 99 }).unwrap(); /// } /// ``` pub unsafe fn write<T, W: io::Write>(writer: &mut W, mut value: T) -> io::Result<usize> { let num_bytes = mem::size_of::<T>(); let buffer: &mut [u8] = slice::from_raw_parts_mut(&mut value as *mut T as *mut u8, num_bytes); writer.write(buffer) }