bin_encode_decode/decode/
impl.rs

1use crate::*;
2
3impl Decode {
4    /// Decodes an encoded string using specified character set.
5    ///
6    /// Processes 4-character groups to reconstruct original bytes by mapping each
7    /// character to its position in the charset.
8    ///
9    /// # Arguments
10    ///
11    /// - `&str` - The character set used for decoding.
12    /// - `&str` - The string to decode.
13    ///
14    /// # Returns
15    ///
16    /// - `Result<String, DecodeError>` - Result of decoding operation.
17    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}