From bdd8fb36019246c5de7480aba63da91e6d256aa3 Mon Sep 17 00:00:00 2001 From: Nick Chambers Date: Mon, 15 Nov 2021 02:31:53 -0600 Subject: [PATCH] Implement a base64 encoder --- rowbot | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/rowbot b/rowbot index 5193eac..d71948d 100755 --- a/rowbot +++ b/rowbot @@ -181,6 +181,34 @@ url() { fi } +b64_encode() { + local idx=0 numerics table_idxs table_idx encoded + local table=( {A..Z} {a..z} {0..9} + / ) + + for (( ; idx < ${#1}; idx+=3 )); do + read -ra numerics < <( + printf '%d %d %d\n' "'${1:idx:1}" "'${1:idx+1:1}" "'${1:idx+2:1}" + ) + + (( table_idxs[0] = numerics[0] >> 2 )) + (( table_idxs[1] = (((numerics[0] & 0x03) << 6) | (numerics[1] & 0xF0) >> 2) >> 2 )) + (( table_idxs[2] = (((numerics[1] & 0x0F) << 4) | (numerics[2] & 0xC0) >> 4) >> 2 )) + (( table_idxs[3] = numerics[2] & 0x3F )) + for table_idx in "${table_idxs[@]}"; do + encoded+=${table[$table_idx]} + done + done + if (( ${#1} % 3 == 1 )); then + encoded=${encoded::-2}== + elif (( ${#1} % 3 == 2 )); then + encoded=${encoded::-1}= + fi + printf %s "$encoded" + if [[ -t 1 ]]; then + printf \\n + fi +} + ### # configure rowbot's environment ###