summaryrefslogtreecommitdiff
path: root/server/src/util.rs
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2025-01-20 19:20:05 +0100
committerTom Smeding <tom@tomsmeding.com>2025-01-20 19:20:05 +0100
commitfec95bcbebec30811a1542fab72750a69668f2f8 (patch)
tree0c9c2c93461fd080f5e0abdbc18c528fb71fa46b /server/src/util.rs
parentab4f5e73a6df4ae8c7249cf45b9c18fb234e5e5b (diff)
server: Reorganise code into files
Diffstat (limited to 'server/src/util.rs')
-rw-r--r--server/src/util.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/server/src/util.rs b/server/src/util.rs
new file mode 100644
index 0000000..6a0d8d9
--- /dev/null
+++ b/server/src/util.rs
@@ -0,0 +1,30 @@
+pub fn base64_encode(bytes: &[u8]) -> String {
+ const ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ let len = (bytes.len() + 2) / 3 * 4;
+ let mut dest = Vec::with_capacity(len);
+ dest.resize(len, 0u8);
+ for i in 0 .. bytes.len() / 3 {
+ dest[4 * i + 0] = ALPHABET[(bytes[3 * i + 0] & 0x3f) as usize];
+ dest[4 * i + 1] = ALPHABET[(((bytes[3 * i + 0] & 0xc0) >> 6) | ((bytes[3 * i + 1] & 0x0f) << 2)) as usize];
+ dest[4 * i + 2] = ALPHABET[(((bytes[3 * i + 1] & 0xf0) >> 4) | ((bytes[3 * i + 2] & 0x03) << 4)) as usize];
+ dest[4 * i + 3] = ALPHABET[((bytes[3 * i + 1] & 0xfc) >> 2) as usize];
+ }
+ let last = bytes.len() / 3;
+ match bytes.len() % 3 {
+ 1 => {
+ dest[4 * last + 0] = ALPHABET[(bytes[3 * last + 0] & 0x3f) as usize];
+ dest[4 * last + 1] = ALPHABET[((bytes[3 * last + 0] & 0xc0) >> 6) as usize];
+ dest[4 * last + 2] = b'=';
+ dest[4 * last + 3] = b'=';
+ }
+ 2 => {
+ dest[4 * last + 0] = ALPHABET[(bytes[3 * last + 0] & 0x3f) as usize];
+ dest[4 * last + 1] = ALPHABET[(((bytes[3 * last + 0] & 0xc0) >> 6) | ((bytes[3 * last + 1] & 0x0f) << 2)) as usize];
+ dest[4 * last + 2] = ALPHABET[((bytes[3 * last + 1] & 0xf0) >> 4) as usize];
+ dest[4 * last + 3] = b'=';
+ }
+ _0 => {}
+ }
+ String::from_utf8(dest).unwrap()
+}