aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-26 15:35:43 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-26 15:35:43 +0200
commitaa3f585408af0ee6235305a156303a6df5b4463a (patch)
treec7d0b4f2fd5c3bea1dcc1c95e7575137ae504e70 /src/main.rs
parent81ae67c934e58ba65c37244ccf21f7cd469ade3e (diff)
downloadhuffman-aa3f585408af0ee6235305a156303a6df5b4463a.tar.gz
huffman-aa3f585408af0ee6235305a156303a6df5b4463a.tar.bz2
huffman-aa3f585408af0ee6235305a156303a6df5b4463a.zip
WIP: Added deserialize, Testing BitSetHEADmaster
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs53
1 files changed, 51 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index a54a3bd..b5062f6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,14 +9,63 @@ pub mod bits;
pub mod conversion;
use tree::Tree;
+use bits::BitSet;
fn main() {
if let Some(s) = env::args().nth(1) {
if s != "d" {
return
}
- // let data: Vec<u8> = io::stdin().bytes().map(|x| x.unwrap()).collect();
- // deserialize
+ let data: Vec<u8> = io::stdin().bytes().map(|x| x.unwrap()).collect();
+
+ let mut iter = data.iter();
+
+ let mut size: u32 = 0;
+ for i in 0..4 {
+ size |= (*iter.next().unwrap() as u32) << ((3 - i) * 8);
+ }
+ // println!("{}", size);
+
+ let mut header_iter = iter.clone().take(size as usize).cloned();
+ let mut table = conversion::Table::new();
+ loop {
+ let test = header_iter.next();
+ if test == None {
+ break;
+ }
+ // FIXME not working with lorem
+ let key = test.unwrap();
+ let bits_len: usize = header_iter.next().unwrap().into();
+ let value: Vec<u8> = header_iter.clone().take(bits_len / 8 +
+ if bits_len % 8 != 0 {1} else {0}).collect();
+ for _ in 0..(bits_len / 8 + 1) {
+ header_iter.next();
+ }
+
+ table.0.insert(key, BitSet { data: value, len: bits_len });
+ }
+ // println!("{:?}", table);
+
+ let data: Vec<u8> = iter.skip(size as usize).cloned().collect();
+ let mut bitset = BitSet { len: data.len() * 8, data: data };
+
+ // TODO: store bit size in serialized, cause wrong matches due to padding
+ let mut found = true;
+ let mut content = Vec::new();
+ while found {
+ println!("{:?}", bitset);
+ found = false;
+ for (k, v) in &table.0 {
+ if bitset.start_with(&v) {
+ content.push(k);
+ bitset <<= v.len;
+ found = true;
+ }
+ }
+ }
+ for x in content {
+ print!("{}", *x as char);
+ }
} else {
// let f = fs::File::open(file_path).unwrap();