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}