use std::io::{Read, Result}; pub trait ReadExt { fn read_u16_be(&mut self) -> Result; fn read_u32_be(&mut self) -> Result; fn read_u64_be(&mut self) -> Result; fn read_u128_be(&mut self) -> Result; fn read_cstr(&mut self) -> Result; } impl ReadExt for T { fn read_u16_be(&mut self) -> Result { let mut buf = [0; 2]; self.read_exact(&mut buf)?; Ok(u16::from_be_bytes(buf)) } fn read_u32_be(&mut self) -> Result { let mut buf = [0; 4]; self.read_exact(&mut buf)?; Ok(u32::from_be_bytes(buf)) } fn read_u64_be(&mut self) -> Result { let mut buf = [0; 8]; self.read_exact(&mut buf)?; Ok(u64::from_be_bytes(buf)) } fn read_u128_be(&mut self) -> Result { let mut buf = [0; 16]; self.read_exact(&mut buf)?; Ok(u128::from_be_bytes(buf)) } fn read_cstr(&mut self) -> Result { let mut buf = [0; 1]; let mut s = Vec::new(); loop { self.read_exact(&mut buf)?; if buf[0] == 0 { break; } s.push(buf[0]); } Ok(String::from_utf8_lossy(&s).to_string()) } }