ciftl/encoding/
base64.rs

1use ::base64::{engine::general_purpose, Engine as _};
2
3use crate::encoding::EncodingTrait;
4use crate::*;
5
6pub struct Base64Encoding();
7
8impl Default for Base64Encoding {
9    fn default() -> Base64Encoding {
10        Base64Encoding()
11    }
12}
13
14impl EncodingTrait for Base64Encoding {
15    fn encode(&self, data: &[u8]) -> String {
16        let mut res: String = String::new();
17        general_purpose::STANDARD.encode_string(&data, &mut res);
18        res
19    }
20    fn decode(&self, data: &str) -> Result<ByteVector> {
21        let mut buffer: Vec<u8> = ByteVector::new();
22        general_purpose::STANDARD
23            .decode_vec(data, &mut buffer)
24            .or(Err(BASE64_BAD_DECODING_SOURCE.clone()))?;
25        Ok(buffer)
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn test_base64() {
35        let b64 = Base64Encoding::default();
36        let res = b64.encode("Hello, ciftl! 你好!".as_bytes());
37        assert_eq!("SGVsbG8sIGNpZnRsISDkvaDlpb3vvIE=".to_string(), res);
38        let res = b64.decode(&res).unwrap();
39        assert_eq!("Hello, ciftl! 你好!".as_bytes(), &res[..]);
40        let res = b64.decode("SGVsbG8sIGNpZnRsISDkvaDlpb3vvIEA=");
41        assert!(res.is_err());
42        println!("错误:{}", res.unwrap_err());
43    }
44}