bin_encode_decode/decode/
impl.rs1use crate::*;
2
3impl Decode {
4 pub fn execute(charset: &str, decode_str: &str) -> Result<String, DecodeError> {
18 if !Charset::judge_charset_safe(charset) {
19 return Err(DecodeError::CharsetError);
20 }
21 let mut buffer: Vec<u8> = Vec::new();
22 let mut decoded: Vec<u8> = Vec::new();
23 for ch in decode_str.chars() {
24 if let Some(idx) = charset.chars().position(|c| c == ch) {
25 buffer.push(idx as u8);
26 }
27 if buffer.len() == 4 {
28 let combined: usize = ((buffer[0] as usize) << 18)
29 | ((buffer[1] as usize) << 12)
30 | ((buffer[2] as usize) << 6)
31 | (buffer[3] as usize);
32 decoded.push((combined >> 16) as u8);
33 decoded.push((combined >> 8) as u8);
34 decoded.push(combined as u8);
35 buffer.clear();
36 }
37 }
38 let decode_res: String =
39 String::from_utf8(decoded.into_iter().filter(|&x| x != 0).collect())
40 .unwrap_or_default();
41 Ok(decode_res)
42 }
43}