38 lines
1.2 KiB
Text
38 lines
1.2 KiB
Text
pub fn char_from_id(id: u8) -> char {
|
|
[' ', '#', '/', '_', 'L', '|', '\n'][id as usize]
|
|
}
|
|
|
|
const ID_BITS: u8 = 3;
|
|
|
|
pub fn decode(code: &[u8]) -> String {
|
|
let mut ret = String::new();
|
|
let mut carry = 0;
|
|
let mut carry_bits = 0;
|
|
for &b in code {
|
|
let mut bit_pos = ID_BITS - carry_bits;
|
|
let mut cur = b >> bit_pos;
|
|
let mask = (1 << bit_pos) - 1;
|
|
let id = carry | (b & mask) << carry_bits;
|
|
ret.push(char_from_id(id));
|
|
while bit_pos + ID_BITS < 8 {
|
|
ret.push(char_from_id(cur & ((1 << ID_BITS) - 1)));
|
|
cur >>= ID_BITS;
|
|
bit_pos += ID_BITS;
|
|
}
|
|
carry = cur;
|
|
carry_bits = 8 - bit_pos;
|
|
}
|
|
ret
|
|
}
|
|
|
|
fn main() {
|
|
let code = [
|
|
72, 146, 36, 0, 0, 0, 0, 0, 0, 0, 128, 196, 74, 182, 41, 1, 0, 0, 0, 0, 0, 0, 160, 196, 77, 0,
|
|
52, 1, 18, 0, 9, 144, 36, 9, 146, 36, 113, 147, 36, 9, 160, 4, 80, 130, 100, 155, 160, 41, 145,
|
|
155, 108, 74, 128, 38, 64, 19, 41, 73, 2, 160, 137, 155, 0, 84, 130, 38, 64, 19, 112, 155, 18,
|
|
160, 137, 155, 0, 160, 18, 42, 73, 18, 36, 73, 2, 128, 74, 76, 1, 0, 40, 128, 219, 38, 104, 219,
|
|
4, 0, 160, 0
|
|
];
|
|
|
|
println!("{}", decode(&code));
|
|
}
|