From 5d956efcdef23efc84c24223d9a23f10deb65279 Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Mon, 6 May 2019 16:56:55 -0400 Subject: [PATCH] Implement most of the boring methods --- Cargo.toml | 1 + src/lib.rs | 157 +++++++++++++++++++++-------------------------------- 2 files changed, 62 insertions(+), 96 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b383cf2..c858a67 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,4 @@ authors = ["Bradlee Speice "] edition = "2018" [dependencies] +byteorder = "1.3.1" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 409cd3f..3645c3c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +use byteorder::{BigEndian, ByteOrder, LittleEndian}; use std::cell::RefCell; #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -55,26 +56,62 @@ pub trait KStream { fn pos(&self) -> KResult; fn size(&self) -> KResult; - fn read_s1(&self) -> KResult; - fn read_s2be(&self) -> KResult; - fn read_s4be(&self) -> KResult; - fn read_s8be(&self) -> KResult; - fn read_s2le(&self) -> KResult; - fn read_s4le(&self) -> KResult; - fn read_s8le(&self) -> KResult; + fn read_s1(&self) -> KResult { + Ok(self.read_bytes(1)?[0] as i8) + } + fn read_s2be(&self) -> KResult { + Ok(BigEndian::read_i16(self.read_bytes(2)?)) + } + fn read_s4be(&self) -> KResult { + Ok(BigEndian::read_i32(self.read_bytes(4)?)) + } + fn read_s8be(&self) -> KResult { + Ok(BigEndian::read_i64(self.read_bytes(8)?)) + } + fn read_s2le(&self) -> KResult { + Ok(LittleEndian::read_i16(self.read_bytes(2)?)) + } + fn read_s4le(&self) -> KResult { + Ok(LittleEndian::read_i32(self.read_bytes(4)?)) + } + fn read_s8le(&self) -> KResult { + Ok(LittleEndian::read_i64(self.read_bytes(8)?)) + } - fn read_u1(&self) -> KResult; - fn read_u2be(&self) -> KResult; - fn read_u4be(&self) -> KResult; - fn read_u8be(&self) -> KResult; - fn read_u2le(&self) -> KResult; - fn read_u4le(&self) -> KResult; - fn read_u8le(&self) -> KResult; + fn read_u1(&self) -> KResult { + Ok(self.read_bytes(1)?[0] as u8) + } + fn read_u2be(&self) -> KResult { + Ok(BigEndian::read_u16(self.read_bytes(2)?)) + } + fn read_u4be(&self) -> KResult { + Ok(BigEndian::read_u32(self.read_bytes(4)?)) + } + fn read_u8be(&self) -> KResult { + Ok(BigEndian::read_u64(self.read_bytes(8)?)) + } + fn read_u2le(&self) -> KResult { + Ok(LittleEndian::read_u16(self.read_bytes(2)?)) + } + fn read_u4le(&self) -> KResult { + Ok(LittleEndian::read_u32(self.read_bytes(4)?)) + } + fn read_u8le(&self) -> KResult { + Ok(LittleEndian::read_u64(self.read_bytes(8)?)) + } - fn read_f4be(&self) -> KResult; - fn read_f8be(&self) -> KResult; - fn read_f4le(&self) -> KResult; - fn read_f8le(&self) -> KResult; + fn read_f4be(&self) -> KResult { + Ok(BigEndian::read_f32(self.read_bytes(4)?)) + } + fn read_f8be(&self) -> KResult { + Ok(BigEndian::read_f64(self.read_bytes(8)?)) + } + fn read_f4le(&self) -> KResult { + Ok(LittleEndian::read_f32(self.read_bytes(4)?)) + } + fn read_f8le(&self) -> KResult { + Ok(LittleEndian::read_f64(self.read_bytes(8)?)) + } fn align_to_byte(&self) -> KResult<()>; fn read_bits_int(&self, n: usize) -> KResult; @@ -164,78 +201,6 @@ impl<'a> KStream for BytesReader<'a> { unimplemented!() } - fn read_s1(&self) -> KResult { - unimplemented!() - } - - fn read_s2be(&self) -> KResult { - unimplemented!() - } - - fn read_s4be(&self) -> KResult { - unimplemented!() - } - - fn read_s8be(&self) -> KResult { - unimplemented!() - } - - fn read_s2le(&self) -> KResult { - unimplemented!() - } - - fn read_s4le(&self) -> KResult { - unimplemented!() - } - - fn read_s8le(&self) -> KResult { - unimplemented!() - } - - fn read_u1(&self) -> KResult { - unimplemented!() - } - - fn read_u2be(&self) -> KResult { - unimplemented!() - } - - fn read_u4be(&self) -> KResult { - unimplemented!() - } - - fn read_u8be(&self) -> KResult { - unimplemented!() - } - - fn read_u2le(&self) -> KResult { - unimplemented!() - } - - fn read_u4le(&self) -> KResult { - unimplemented!() - } - - fn read_u8le(&self) -> KResult { - unimplemented!() - } - - fn read_f4be(&self) -> KResult { - unimplemented!() - } - - fn read_f8be(&self) -> KResult { - unimplemented!() - } - - fn read_f4le(&self) -> KResult { - unimplemented!() - } - - fn read_f8le(&self) -> KResult { - unimplemented!() - } - fn align_to_byte(&self) -> KResult<()> { let mut inner = self.state.borrow_mut(); inner.bits = 0; @@ -323,7 +288,7 @@ mod tests { #[test] fn basic_read_bytes() { let b = vec![1, 2, 3, 4, 5, 6, 7, 8]; - let mut reader = BytesReader::new(&b[..]); + let reader = BytesReader::new(&b[..]); assert_eq!(reader.read_bytes(4).unwrap(), &[1, 2, 3, 4]); assert_eq!(reader.read_bytes(3).unwrap(), &[5, 6, 7]); @@ -337,7 +302,7 @@ mod tests { #[test] fn read_bits_single() { let b = vec![0x80]; - let mut reader = BytesReader::new(&b[..]); + let reader = BytesReader::new(&b[..]); assert_eq!(reader.read_bits_int(1).unwrap(), 1); } @@ -346,7 +311,7 @@ mod tests { fn read_bits_multiple() { // 0xA0 let b = vec![0b10100000]; - let mut reader = BytesReader::new(&b[..]); + let reader = BytesReader::new(&b[..]); assert_eq!(reader.read_bits_int(1).unwrap(), 1); assert_eq!(reader.read_bits_int(1).unwrap(), 0); @@ -356,7 +321,7 @@ mod tests { #[test] fn read_bits_large() { let b = vec![0b10100000]; - let mut reader = BytesReader::new(&b[..]); + let reader = BytesReader::new(&b[..]); assert_eq!(reader.read_bits_int(3).unwrap(), 5); } @@ -364,7 +329,7 @@ mod tests { #[test] fn read_bits_span() { let b = vec![0x01, 0x80]; - let mut reader = BytesReader::new(&b[..]); + let reader = BytesReader::new(&b[..]); assert_eq!(reader.read_bits_int(9).unwrap(), 3); } @@ -372,7 +337,7 @@ mod tests { #[test] fn read_bits_too_large() { let b: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; - let mut reader = BytesReader::new(&b[..]); + let reader = BytesReader::new(&b[..]); assert_eq!(reader.read_bits_int(65).unwrap_err(), KError::ReadBitsTooLarge { requested: 65 }) }