diff --git a/Cargo.toml b/Cargo.toml index c88318c..60ba981 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,8 @@ rust-version = "1.56.1" no_games = [] [dependencies] +byteorder = "1.4.3" + bzip2-rs = "0.1.2" # for compression crc32fast = "1.3.2" diff --git a/src/bufferer.rs b/src/bufferer.rs index 22453ce..4a6ddc8 100644 --- a/src/bufferer.rs +++ b/src/bufferer.rs @@ -1,5 +1,6 @@ use crate::GDResult; use crate::GDError::{PacketBad, PacketUnderflow}; +use byteorder::{ByteOrder, LittleEndian, BigEndian}; pub enum Endianess { Little, Big @@ -39,11 +40,9 @@ impl Bufferer { return Err(PacketUnderflow); } - let source_data: [u8; 2] = (&self.data[self.position..self.position + 2]).try_into().unwrap(); - let value = match self.endianess { - Endianess::Little => u16::from_le_bytes(source_data), - Endianess::Big => u16::from_be_bytes(source_data) + Endianess::Little => LittleEndian::read_u16(self.remaining_data()), + Endianess::Big => BigEndian::read_u16(self.remaining_data()), }; self.position += 2; @@ -55,11 +54,9 @@ impl Bufferer { return Err(PacketUnderflow); } - let source_data: [u8; 4] = (&self.data[self.position..self.position + 4]).try_into().unwrap(); - let value = match self.endianess { - Endianess::Little => u32::from_le_bytes(source_data), - Endianess::Big => u32::from_be_bytes(source_data) + Endianess::Little => LittleEndian::read_u32(self.remaining_data()), + Endianess::Big => BigEndian::read_u32(self.remaining_data()), }; self.position += 4; @@ -71,11 +68,9 @@ impl Bufferer { return Err(PacketUnderflow); } - let source_data: [u8; 4] = (&self.data[self.position..self.position + 4]).try_into().unwrap(); - let value = match self.endianess { - Endianess::Little => f32::from_le_bytes(source_data), - Endianess::Big => f32::from_be_bytes(source_data) + Endianess::Little => LittleEndian::read_f32(self.remaining_data()), + Endianess::Big => BigEndian::read_f32(self.remaining_data()) }; self.position += 4; @@ -87,11 +82,9 @@ impl Bufferer { return Err(PacketUnderflow); } - let source_data: [u8; 8] = (&self.data[self.position..self.position + 8]).try_into().unwrap(); - let value = match self.endianess { - Endianess::Little => u64::from_le_bytes(source_data), - Endianess::Big => u64::from_be_bytes(source_data) + Endianess::Little => LittleEndian::read_u64(self.remaining_data()), + Endianess::Big => BigEndian::read_u64(self.remaining_data()) }; self.position += 8; @@ -151,10 +144,6 @@ impl Bufferer { pub fn move_position_backward(&mut self, by: usize) { self.position -= by; } - - pub fn get_data_in_front_of_position(&self) -> Vec { - self.data[self.position..].to_vec() - } pub fn data_length(&self) -> usize { self.data.len() @@ -164,6 +153,10 @@ impl Bufferer { &self.data[self.position..] } + pub fn remaining_data_vec(&self) -> Vec { + self.data[self.position..].to_vec() + } + pub fn remaining_length(&self) -> usize { self.data.len() - self.position } diff --git a/src/protocols/valve/protocol.rs b/src/protocols/valve/protocol.rs index 6c1c60c..ee3b675 100644 --- a/src/protocols/valve/protocol.rs +++ b/src/protocols/valve/protocol.rs @@ -21,7 +21,7 @@ impl Packet { Ok(Self { header: buffer.get_u32()?, kind: buffer.get_u8()?, - payload: buffer.get_data_in_front_of_position() + payload: buffer.remaining_data_vec() }) } @@ -110,7 +110,7 @@ impl SplitPacket { compressed, decompressed_size, uncompressed_crc32, - payload: buffer.get_data_in_front_of_position() + payload: buffer.remaining_data_vec() }) }