diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-06-26 15:35:43 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-06-26 15:35:43 +0200 |
| commit | aa3f585408af0ee6235305a156303a6df5b4463a (patch) | |
| tree | c7d0b4f2fd5c3bea1dcc1c95e7575137ae504e70 /src/main.rs | |
| parent | 81ae67c934e58ba65c37244ccf21f7cd469ade3e (diff) | |
| download | huffman-aa3f585408af0ee6235305a156303a6df5b4463a.tar.gz huffman-aa3f585408af0ee6235305a156303a6df5b4463a.tar.bz2 huffman-aa3f585408af0ee6235305a156303a6df5b4463a.zip | |
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 53 |
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(); |
