diff options
Diffstat (limited to 'unpacker/src')
-rw-r--r-- | unpacker/src/lib.rs | 44 | ||||
-rw-r--r-- | unpacker/src/main.rs | 24 |
2 files changed, 68 insertions, 0 deletions
diff --git a/unpacker/src/lib.rs b/unpacker/src/lib.rs new file mode 100644 index 0000000..f649581 --- /dev/null +++ b/unpacker/src/lib.rs @@ -0,0 +1,44 @@ +#[derive(Debug)] +pub struct Unpacker { + pub out: Vec<u8>, + pub work: u16, + pub work_idx: usize, +} + +impl Unpacker { + pub fn new() -> Self { + Self { + out: vec![], + work: 0, + work_idx: 0, + } + } + + pub fn push(&mut self, byte: u8) { + self.work = self.work << 8; + self.work |= byte as u16; + self.work_idx += 8; + + //println!("[{work_idx}]"); + + if self.work_idx >= 10 { + let to_front = self.work_idx - 10; + let fronted = self.work >> to_front; + let masked = fronted & 0b000_000_111_11_111_11; + + let fixwork = fronted << to_front; + + self.out.extend(masked.to_le_bytes()); + self.work_idx -= 10; + self.work ^= fixwork; + } + } + + pub fn finish(&mut self) { + if self.work_idx > 0 { + let remain = 10 - self.work_idx; + let out = self.work << remain; + self.out.extend(out.to_le_bytes()) + } + } +} diff --git a/unpacker/src/main.rs b/unpacker/src/main.rs new file mode 100644 index 0000000..047b4c5 --- /dev/null +++ b/unpacker/src/main.rs @@ -0,0 +1,24 @@ +use unpacker::Unpacker; + +fn main() { + // Four bits padding at the end. + let testdata = vec![ + 0b10000000, 0b00010000, 0b00000010, 0b00000000, 0b01000000, 0b00001000, 0b00000001, + 0b00000000, 0b00100000, 0b00000100, 0b00000000, 0b10000000, 0b00010000, + ]; + + let mut up = Unpacker { + out: vec![], + work: 0, + work_idx: 0, + }; + + for byte in testdata { + up.push(byte); + } + up.finish(); + + for chnk in up.out.chunks(2) { + println!("{:08b} {:08b}", chnk[0], chnk[1]); + } +} |