pub trait ByteUtils { fn get_u8(&self, index: usize) -> u8; fn get_u16(&self, index: usize) -> u16; fn get_u32(&self, index: usize) -> u32; fn get_u64(&self, index: usize) -> u64; fn get_bytes32(&self, index: usize) -> &[u8]; } impl ByteUtils for &[u8] { fn get_u8(&self, index: usize) -> u8 { self[index] } fn get_u16(&self, index: usize) -> u16 { let mut bytes: [u8; 16 / 8] = [0; 16 / 8]; bytes.copy_from_slice(&self[index..index + 2]); u16::from_be_bytes(bytes) } fn get_u32(&self, index: usize) -> u32 { let mut bytes: [u8; 32 / 8] = [0; 32 / 8]; bytes.copy_from_slice(&self[index..index + 4]); u32::from_be_bytes(bytes) } fn get_u64(&self, index: usize) -> u64 { let mut bytes: [u8; 64 / 8] = [0; 64 / 8]; bytes.copy_from_slice(&self[index..index + 8]); u64::from_be_bytes(bytes) } fn get_bytes32(&self, index: usize) -> &[u8] { &self[index..index + 32] } }