diff --git a/bash/b64 b/bash/b64 new file mode 100644 index 0000000..02a2025 --- /dev/null +++ b/bash/b64 @@ -0,0 +1,29 @@ +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 + + prints %s "$encoded" +} + +b64_encode "$1"