-
-
Save kujirahand/6eee28471ccba7f186da7379c6e430ac to your computer and use it in GitHub Desktop.
Rust Base64 Encoder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Base64のエンコード処理を作る | |
fn main() { // 適当な文字列をBase64に変換して結果を表示 --- (*1) | |
let s = "hello!"; | |
println!("{} => {}", s, base64_encode(s)); | |
let s = "Rust"; | |
println!("{} => {}", s, base64_encode(s)); | |
let s = "生姜焼き定食"; | |
println!("{} => {}", s, base64_encode(s)); | |
} | |
// Base64エンコードを行う関数 --- (*2) | |
fn base64_encode(in_str: &str) -> String { | |
// Base64の変換テーブルを1文字ずつに区切る --- (*3) | |
let tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |
let table = tbl.chars().collect::<Vec<char>>(); | |
// 変換結果を保持する文字列 --- (*4) | |
let mut result = String::new(); | |
// 入力文字列をバイト列に変換 --- (*5) | |
let bin8 = in_str.as_bytes(); | |
// 繰り返し24bitごと(3文字ずつ)に処理する --- (*6) | |
let cnt = bin8.len() / 3; | |
for i in 0..cnt { | |
let n = i * 3; // 3文字(24bit)ずつ処理 --- (*7) | |
let b24 = ((bin8[n+0] as usize) << 16) + | |
((bin8[n+1] as usize) << 8) + | |
((bin8[n+2] as usize) << 0); | |
result.push(table[(b24 >> 18) & 0x3f]); // 6bitずつ変換 --- (*8) | |
result.push(table[(b24 >> 12) & 0x3f]); | |
result.push(table[(b24 >> 6) & 0x3f]); | |
result.push(table[(b24 >> 0) & 0x3f]); | |
} | |
// 3バイトずつに割り切れなかった余りの部分を処理 --- (*9) | |
match bin8.len() % 3 { | |
1 => { | |
let b24 = (bin8[cnt*3] as usize) << 16; | |
result.push(table[(b24 >> 18) & 0x3f]); | |
result.push(table[(b24 >> 12) & 0x3f]); | |
result.push_str("=="); | |
}, | |
2 => { | |
let b24 = ((bin8[cnt*3+0] as usize) << 16) + | |
((bin8[cnt*3+1] as usize) << 8); | |
result.push(table[(b24 >> 18) & 0x3f]); | |
result.push(table[(b24 >> 12) & 0x3f]); | |
result.push(table[(b24 >> 6) & 0x3f]); | |
result.push('='); | |
}, | |
_ => {}, | |
} | |
result | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment