diff options
Diffstat (limited to 'src/encoding.rs')
-rw-r--r-- | src/encoding.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/encoding.rs b/src/encoding.rs index fc0c335..9bc7290 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -1,7 +1,6 @@ use std::convert::TryFrom; -use std::io; +use std::io::{self, Write}; use crate::error::IntoIOError; -use crate::util::read_big_endian; macro_rules! guard { ($cond:expr) => { @@ -54,3 +53,37 @@ pub fn from_utf8_mistaken_as_latin1(latin1: &str) -> io::Result<String> { .map(|s| s.to_string()) .map_err(|e| e.ioerr())) } + +pub fn read_big_endian(bytes: &[u8], bits: usize) -> usize { + if bits > 8 { + panic!("Invalid number of bits in encoding::read_big_endian()"); + } + + bytes + .iter() + .enumerate() + .map(|(i, &b)| (b as usize) << (bits * (bytes.len() - 1 - i))) + .sum() +} + +pub fn write_big_endian<W: Write>(mut stream: W, mut value: usize, num_bytes: usize, bits: usize) -> io::Result<()> { + if num_bytes > 8 { + panic!("Invalid number of bytes in encoding::write_big_endian()"); + } + if bits > 8 || bits == 0 { + panic!("Invalid number of bits in encoding::write_big_endian()"); + } + + let mask = (1 << bits) - 1; + let mut bytes = [0u8; 8]; + for i in (0..num_bytes).rev() { + bytes[i] = (value & mask) as u8; + value >>= bits; + } + + if value != 0 { + panic!("Value doesn't fit in encoding::write_big_endian()"); + } + + stream.write_all(&bytes[0..num_bytes]) +} |