summaryrefslogtreecommitdiff
path: root/src/encoding.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding.rs')
-rw-r--r--src/encoding.rs37
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])
+}