Skip to content

Instantly share code, notes, and snippets.

@kujirahand
Created February 19, 2023 12:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kujirahand/6eee28471ccba7f186da7379c6e430ac to your computer and use it in GitHub Desktop.
Save kujirahand/6eee28471ccba7f186da7379c6e430ac to your computer and use it in GitHub Desktop.
Rust Base64 Encoder
// 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