|
|
@@ -4,27 +4,42 @@ use bit_vec::BitVec;
|
|
|
use std::io::Read;
|
|
|
use std::io::Write;
|
|
|
|
|
|
-pub fn store_tree<F: Write>(tree: CanonicalHufftree, writer: &mut F) -> Result<(), String> {
|
|
|
+pub fn store_tree_and_text<F: Write>(tree: CanonicalHufftree, writer: &mut F, text: &String) -> Result<(), String> {
|
|
|
let mut buff = BitVec::new();
|
|
|
let mut character_buff: [u8; 4] = [0; 4];
|
|
|
+ let mut bit_length: u32 = 0;
|
|
|
|
|
|
for (character, code) in tree.get_character_codes() {
|
|
|
let code_length: u32 = code.len().try_into().unwrap();
|
|
|
- let mut code_length_vec = convert_no_to_bit_vec(code_length);
|
|
|
- buff.append(&mut code_length_vec);
|
|
|
+ let code_length = code_length.to_be_bytes();
|
|
|
+ buff.append(&mut BitVec::from_bytes(&code_length));
|
|
|
+ bit_length += 32;
|
|
|
+
|
|
|
buff.append(&mut BitVec::from_elem(8, false));
|
|
|
+ bit_length += 8;
|
|
|
+
|
|
|
character.encode_utf8(&mut character_buff);
|
|
|
buff.append(&mut BitVec::from_bytes(&character_buff));
|
|
|
+ bit_length += 32;
|
|
|
|
|
|
character_buff.fill(0);
|
|
|
}
|
|
|
|
|
|
+ let encoded_text = tree.encode_text(&text);
|
|
|
+
|
|
|
+ let text_bits:u32 = encoded_text.len().try_into().unwrap();
|
|
|
+
|
|
|
+ println!("Bit length: {}, Text bits: {}.", bit_length, text_bits);
|
|
|
+ bit_length += text_bits;
|
|
|
+
|
|
|
let buff = buff.to_bytes();
|
|
|
- let buff_len: u32 = buff.len().try_into().unwrap();
|
|
|
+ println!("Buffer when in bytes:{:?}", buff);
|
|
|
+ // let buff_len: u32 = TryInto::<u32>::try_into(buff.len()).unwrap() * 8;
|
|
|
|
|
|
- writer.write_all(&buff_len.to_be_bytes()).unwrap();
|
|
|
+ let encoded_text = encoded_text.to_bytes();
|
|
|
+ writer.write_all(&bit_length.to_be_bytes()).unwrap();
|
|
|
writer.write_all(&buff).unwrap();
|
|
|
-
|
|
|
+ writer.write_all(&encoded_text).unwrap();
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
@@ -45,8 +60,10 @@ mod test {
|
|
|
let huff = Hufftree::new(chars_and_freq);
|
|
|
let canonical = CanonicalHufftree::from_tree(huff);
|
|
|
|
|
|
+ let input_text = String::from("aaabacacaaaabbbbbbbccccccccccccaacc");
|
|
|
+
|
|
|
let mut virtual_buffer = Vec::new();
|
|
|
- store_tree(canonical, &mut virtual_buffer).unwrap();
|
|
|
+ store_tree_and_text(canonical, &mut virtual_buffer, &input_text).unwrap();
|
|
|
|
|
|
println!("Buffer:{:?}", virtual_buffer);
|
|
|
|