これ、何回やっても忘れてしまうな…
base64= “0.22.1”
use base64::prelude::*; fn main() { let ip = "192.168.33.10".to_string(); println!("{}", base64_str(&ip)); let str = "MTkyLjE2OC4zMy4xMA==".to_string(); println!("{}", base64_decode(&str)); } fn base64_str(str: &String) -> String { BASE64_STANDARD.encode(&str) } fn base64_decode_bytes(b64str: &str) -> Vec<u8> { let t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; let mut table: [u8; 256] = [0; 256]; for (i, v) in t.as_bytes().iter().enumerate() { table[*v as usize] = i as u8; } let b64 = String::from(b64str).replace("\r", "").replace("\n", ""); let b64bytes = b64.as_bytes(); let mut result: Vec<u8> = vec![]; let cnt = b64bytes.len() / 4; for i in 0..cnt { let i0 = b64bytes[i*4+0]; let i1 = b64bytes[i*4+1]; let i2 = b64bytes[i*4+2]; let i3 = b64bytes[i*4+3]; let c0 = table[i0 as usize] as usize; let c1 = table[i1 as usize] as usize; let c2 = table[i2 as usize] as usize; let c3 = table[i3 as usize] as usize; let b24 = (c0 << 18) | (c1 << 12) | (c2 << 6) | (c3 << 0); let b0 = ((b24 >> 16) & 0xFF) as u8; let b1 = ((b24 >> 8) & 0xFF) as u8; let b2 = ((b24 >> 0) & 0xFF) as u8; result.push(b0); if i2 as char != '=' { result.push(b1); } if i3 as char != '=' { result.push(b2); } } result } fn base64_decode(b64str: &str) -> String { String::from_utf8(base64_decode_bytes(b64str)).unwrap() }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.51s
Running `target/debug/app`
MTkyLjE2OC4zMy4xMA==
192.168.33.10