fork download
  1. struct B64 {
  2. w: usize,
  3. table: Vec<char>,
  4. }
  5. impl B64 {
  6. fn new() -> B64 {B64::with_w(6)}
  7. fn with_w(w: usize) -> B64 {
  8. B64{w: w, table: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".chars().collect()}
  9. }
  10. fn encode(&self, s: &str) -> String {
  11. s.as_bytes().iter()
  12. .flat_map(|b| (0..8).map(move |i| b >> (7 - i) & 1u8 != 0u8))
  13. .collect::<Vec<_>>().chunks(self.w)
  14. .map(|bw| bw.iter().enumerate().fold(0, |acc, (i, b)| acc + ((*b as u8) << (self.w - 1 - i))))
  15. .map(|u| self.table[u as usize])
  16. .chain(std::iter::repeat('=').take(s.as_bytes().len() * 8 % self.w % 4 % 4))
  17. .collect()
  18. }
  19. fn decode(&self, s: &str) -> String {
  20. let us: Vec<u8> = s.chars().take_while(|d| *d != '=')
  21. .flat_map(|c| self.table.iter().position(|e| *e == c))
  22. .flat_map(|b| (0..self.w).map(move |i| b as u8 >> (self.w - 1 - i) & 1u8 != 0u8))
  23. .collect::<Vec<_>>().chunks(8).filter(|b8| b8.len() == 8)
  24. .map(|b8| b8.iter().enumerate().fold(0, |acc, (i, b)| acc + ((*b as u8) << (7 - i))))
  25. .collect();
  26. String::from_utf8(us).unwrap_or(String::new())
  27. }
  28. }
  29. fn main() {
  30. let p = |b: &B64, s| {
  31. let e = b.encode(s);
  32. let d = b.decode(e.as_str());
  33. println!("{}\n{}\n{}\n", s, e, d);
  34. };
  35. let f = |b| for s in &["ABCDEFG", "Hello, World!", "0123456789\"#$%&'()`=@", "💖"] {p(&b, s)};
  36. f(B64::new());
  37. f(B64::with_w(5));
  38. f(B64::with_w(3));
  39. }
  40.  
Success #stdin #stdout 0s 4268KB
stdin
Standard input is empty
stdout
ABCDEFG
QUJDREVGRw==
ABCDEFG

Hello, World!
SGVsbG8sIFdvcmxkIQ==
Hello, World!

0123456789"#$%&'()`=@
MDEyMzQ1Njc4OSIjJCUmJygpYD1A
0123456789"#$%&'()`=@

💖
8J+Slg==
💖

ABCDEFG
IFBEGRCFIZDQ=
ABCDEFG

Hello, World!
JBSWYbDPFQQFObbSNRSCC
Hello, World!

0123456789"#$%&'()`=@
GAYTEMZUGUbDOOBZEIRSIJJGEcUCSYBdIA===
0123456789"#$%&'()`=@

💖
eCPZFFQ==
💖

ABCDEFG
CACEBBADCBAECFAGCBG==
ABCDEFG

Hello, World!
CCAGCFFEDDAGHEFEBAAFDFFHDEEGGBEEBAC==
Hello, World!

0123456789"#$%&'()`=@
BEADAEGCBEGDCAGFBFEDDEHABGCCBAEDBBACCEEGBBGCEAFBDAADGFAA
0123456789"#$%&'()`=@

💖
HEBBHGCCEFE==
💖