aboutsummaryrefslogtreecommitdiff
path: root/src/helper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/helper.rs')
-rw-r--r--src/helper.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/helper.rs b/src/helper.rs
new file mode 100644
index 0000000..79c2872
--- /dev/null
+++ b/src/helper.rs
@@ -0,0 +1,43 @@
+use std::io::{Read, Result};
+
+pub trait ReadExt {
+ fn read_u16_be(&mut self) -> Result<u16>;
+ fn read_u32_be(&mut self) -> Result<u32>;
+ fn read_u64_be(&mut self) -> Result<u64>;
+ fn read_u128_be(&mut self) -> Result<u128>;
+ fn read_cstr(&mut self) -> Result<String>;
+}
+impl<T: Read> ReadExt for T {
+ fn read_u16_be(&mut self) -> Result<u16> {
+ let mut buf = [0; 2];
+ self.read_exact(&mut buf)?;
+ Ok(u16::from_be_bytes(buf))
+ }
+ fn read_u32_be(&mut self) -> Result<u32> {
+ let mut buf = [0; 4];
+ self.read_exact(&mut buf)?;
+ Ok(u32::from_be_bytes(buf))
+ }
+ fn read_u64_be(&mut self) -> Result<u64> {
+ let mut buf = [0; 8];
+ self.read_exact(&mut buf)?;
+ Ok(u64::from_be_bytes(buf))
+ }
+ fn read_u128_be(&mut self) -> Result<u128> {
+ let mut buf = [0; 16];
+ self.read_exact(&mut buf)?;
+ Ok(u128::from_be_bytes(buf))
+ }
+ fn read_cstr(&mut self) -> Result<String> {
+ 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())
+ }
+}