init simple crate for doing base64 encoding/decoding
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/target
|
||||
Generated
+7
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.1.0"
|
||||
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "base64"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
|
||||
const BASE64_ALPHABET: [u8; 64] = *b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
pub fn encode(bytes: Vec<u8>) -> String {
|
||||
let mut output : Vec<char> = Vec::new();
|
||||
for chunk in bytes.chunks(3) {
|
||||
let b0 = chunk.get(0).copied().unwrap_or(0) as u32;
|
||||
let b1 = chunk.get(1).copied().unwrap_or(0) as u32;
|
||||
let b2 = chunk.get(2).copied().unwrap_or(0) as u32;
|
||||
|
||||
// 24-bit number
|
||||
let triple = (b0 << 16) | (b1 << 8) | b2;
|
||||
|
||||
// in 6-bit indices
|
||||
let i0 = ((triple >> 18) & 0x3F) as usize;
|
||||
let i1 = ((triple >> 12) & 0x3F) as usize;
|
||||
let i2 = ((triple >> 6) & 0x3F) as usize;
|
||||
let i3 = (triple & 0x3F) as usize;
|
||||
|
||||
// at least 1 chunk of 8-bit input
|
||||
// so at least 2 chunks of 6-bit window is valid
|
||||
output.push(BASE64_ALPHABET[i0] as char);
|
||||
output.push(BASE64_ALPHABET[i1] as char);
|
||||
|
||||
match chunk.len() {
|
||||
1 => {
|
||||
output.push('=');
|
||||
output.push('=');
|
||||
},
|
||||
2 => {
|
||||
output.push(BASE64_ALPHABET[i2] as char);
|
||||
output.push('=');
|
||||
},
|
||||
3 => {
|
||||
output.push(BASE64_ALPHABET[i2] as char);
|
||||
output.push(BASE64_ALPHABET[i3] as char);
|
||||
},
|
||||
_ => unreachable!()
|
||||
}
|
||||
}
|
||||
output.into_iter().collect()
|
||||
}
|
||||
|
||||
pub fn decode(_b64_str: &String) -> Option<Vec<u8>> {
|
||||
// todo
|
||||
Some(vec!()) // dummy
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_encode() {
|
||||
let input = "f";
|
||||
let bytes = input.as_bytes().to_vec();
|
||||
let base64 = encode(bytes);
|
||||
assert_eq!(base64, String::from("Zg=="));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user