MST

星途 面试题库

面试题:Rust中自定义字符编码格式的解析与生成

假设要设计一种自定义的字符编码格式,该格式具有特定的头部信息和数据位表示字符。请使用Rust编写一个完整的模块,实现对这种自定义编码格式的字符串解析和生成。要求考虑到错误处理、性能优化以及与标准库的兼容性。
37.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
mod custom_encoding {
    use std::fmt;
    use std::str;

    // 自定义编码格式的头部信息长度
    const HEADER_LEN: usize = 4;

    // 自定义编码格式的错误类型
    #[derive(Debug)]
    pub enum CustomEncodingError {
        InvalidHeader,
        InvalidLength,
        InvalidUtf8,
    }

    impl fmt::Display for CustomEncodingError {
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
            match self {
                CustomEncodingError::InvalidHeader => write!(f, "Invalid header"),
                CustomEncodingError::InvalidLength => write!(f, "Invalid length"),
                CustomEncodingError::InvalidUtf8 => write!(f, "Invalid UTF - 8"),
            }
        }
    }

    // 解析自定义编码格式的字符串
    pub fn decode(s: &[u8]) -> Result<String, CustomEncodingError> {
        if s.len() < HEADER_LEN {
            return Err(CustomEncodingError::InvalidLength);
        }
        let header = &s[0..HEADER_LEN];
        if header != b"CODE" {
            return Err(CustomEncodingError::InvalidHeader);
        }
        let data = &s[HEADER_LEN..];
        str::from_utf8(data).map_err(|_| CustomEncodingError::InvalidUtf8).map(String::from)
    }

    // 生成自定义编码格式的字符串
    pub fn encode(s: &str) -> Vec<u8> {
        let mut result = Vec::with_capacity(HEADER_LEN + s.len());
        result.extend_from_slice(b"CODE");
        result.extend_from_slice(s.as_bytes());
        result
    }
}

你可以这样使用这个模块:

fn main() {
    let original_str = "Hello, World!";
    let encoded = custom_encoding::encode(original_str);
    match custom_encoding::decode(&encoded) {
        Ok(decoded) => assert_eq!(decoded, original_str),
        Err(e) => eprintln!("Decode error: {}", e),
    }
}