From a5cac7522bd434dc33dc0a046c8872bdfb829895 Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Thu, 9 Jan 2025 12:50:54 -0500 Subject: [PATCH] Make alphabet use bytes instead of characters --- src/decode.rs | 2 +- src/encode.rs | 11 +++++++++-- src/lib.rs | 19 ++++++++++--------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 4a5683a..1f4ab3e 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -65,7 +65,7 @@ impl Decoder { for (i, &c) in in_buf.iter().enumerate() { let c = c.into(); num <<= 6; - if c == self.alphabet.pad() { + if c == char::from(self.alphabet.pad()) { continue; } if i != bytes { diff --git a/src/encode.rs b/src/encode.rs index 9038315..326e866 100644 --- a/src/encode.rs +++ b/src/encode.rs @@ -68,14 +68,21 @@ impl Encoder { } if let Some(wrap) = self.wrap { for idx in 0..=3 { - write!(self.writer, "{}", obuf[idx])?; + write!(self.writer, "{}", char::from(obuf[idx]))?; total += 1; if total % wrap == 0 { writeln!(self.writer)?; } } } else { - write!(self.writer, "{}{}{}{}", obuf[0], obuf[1], obuf[2], obuf[3])?; + write!( + self.writer, + "{}{}{}{}", + char::from(obuf[0]), + char::from(obuf[1]), + char::from(obuf[2]), + char::from(obuf[3]) + )?; } if outlen < 4 { break; diff --git a/src/lib.rs b/src/lib.rs index ce37166..bbcf11e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,19 +10,20 @@ pub use {decode::Decoder, encode::Encoder, error::Error as B64Error}; #[derive(Clone, Copy)] /// Defines the character set used for encoding and decoding pub struct B64Alphabet { - items: [char; 64], - pad: char, + items: [u8; 64], + pad: u8, } /// The most common Base64 alphabet as defined in [RFC4648](https://www.rfc-editor.org/rfc/rfc4648) pub static B64_RFC4648_ALPHABET: B64Alphabet = B64Alphabet { items: [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', - 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', - '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', + b'A', b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', + b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W', b'X', b'Y', b'Z', b'a', b'b', b'c', b'd', + b'e', b'f', b'g', b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o', b'p', b'q', b'r', b's', + b't', b'u', b'v', b'w', b'x', b'y', b'z', b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', + b'8', b'9', b'+', b'/', ], - pad: '=', + pad: b'=', }; impl Default for B64Alphabet { @@ -34,14 +35,14 @@ impl Default for B64Alphabet { impl B64Alphabet { pub(crate) fn get(&self, c: char) -> Option { for (idx, x) in self.items.iter().enumerate() { - if *x == c { + if char::from(*x) == c { return Some(idx); } } None } - pub(crate) fn pad(&self) -> char { + pub(crate) fn pad(&self) -> u8 { self.pad } }