面试题答案
一键面试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),
}
}