Skip to main content

mycommon_utils/utils/
base64.rs

1use std::io::{self, Read};
2use base64::engine::general_purpose::STANDARD;
3use base64::Engine;
4
5pub struct Base64Utils;
6
7impl Base64Utils {
8    /// 将字符串编码为 Base64
9    pub fn encode(input: &str) -> String {
10        STANDARD.encode(input)
11    }
12
13    /// 将 Base64 字符串解码为原始字符串
14    pub fn decode(input: &str) -> Result<String, base64::DecodeError> {
15        STANDARD
16            .decode(input.trim()) // 修正标准输入可能带来的换行符问题
17            .map(|bytes| String::from_utf8_lossy(&bytes).to_string())
18    }
19
20    /// 从标准输入读取数据并编码为 Base64,输出到标准输出
21    pub fn encode_from_stdin() -> Result<(), Box<dyn std::error::Error>> {
22        let mut input = String::new();
23        io::stdin().read_to_string(&mut input)?;
24        let encoded = Self::encode(&input);
25        println!("{}", encoded);
26        Ok(())
27    }
28
29    /// 从标准输入读取 Base64 数据并解码为原始字符串,输出到标准输出
30    pub fn decode_to_stdout() -> Result<(), Box<dyn std::error::Error>> {
31        let mut input = String::new();
32        io::stdin().read_to_string(&mut input)?;
33        match Self::decode(&input) {
34            Ok(decoded) => println!("{}", decoded),
35            Err(e) => eprintln!("Error decoding Base64: {}", e),
36        }
37        Ok(())
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::Base64Utils;
44
45    #[test]
46    fn test_base64_encode() {
47        let input = "Hello, Rust!";
48        let encoded = Base64Utils::encode(input);
49        assert_eq!(encoded, "SGVsbG8sIFJ1c3Qh");
50    }
51
52    #[test]
53    fn test_base64_decode() {
54        let input = "SGVsbG8sIFJ1c3Qh";
55        let decoded = Base64Utils::decode(input).unwrap();
56        assert_eq!(decoded, "Hello, Rust!");
57    }
58
59    #[test]
60    fn test_base64_decode_invalid() {
61        let input = "Invalid_Base64!";
62        assert!(Base64Utils::decode(input).is_err());
63    }
64}
65
66#[test]
67fn main() {
68    // 示例用法
69    let original = "API:a123456";
70    let encoded = Base64Utils::encode(original);
71    println!("Encoded: {}", encoded);
72
73    match Base64Utils::decode(&encoded) {
74        Ok(decoded) => println!("Decoded: {}", decoded),
75        Err(e) => println!("Error: {}", e),
76    }
77
78    // 与标准输入交互
79    // println!("Enter a string to encode (Ctrl+D to end input):");
80    // if let Err(e) = Base64Utils::encode_from_stdin() {
81    //     eprintln!("Error: {}", e);
82    // }
83
84    // println!("Enter a Base64 string to decode (Ctrl+D to end input):");
85    // if let Err(e) = Base64Utils::decode_to_stdout() {
86    //     eprintln!("Error: {}", e);
87    // }
88}