Skip to content

Instantly share code, notes, and snippets.

@uenoB
Last active January 11, 2018 07:17
Show Gist options
  • Select an option

  • Save uenoB/e6cf9f9a419775dbdde1503c9b0a3fd8 to your computer and use it in GitHub Desktop.

Select an option

Save uenoB/e6cf9f9a419775dbdde1503c9b0a3fd8 to your computer and use it in GitHub Desktop.
pure-POSIX shell script base64 encoder/decoder
#!/bin/sh
# To the extent possible under law, the author has waived all copyright
# and related or neighboring rights to this software by associating the
# CC0 1.0 (http://creativecommons.org/publicdomain/zero/1.0/) with it.
#
# base16 encoder/decoder.
# usage: base [-D] [filename ...]
# if -D is specified, it decodes input base16 stream.
# otherwise, it encodes input binary data in base16.
if [ "x$1" = "x-D" ]; then
shift 1
cat -- "$@" | tr -C -d '0123456789abcdefABCDEF' | fold -w 80 | sed '
s/0/0000/g;s/1/0001/g;s/2/0010/g;s/3/0011/g;s/4/0100/g;
s/5/0101/g;s/6/0110/g;s/7/0111/g;s/8/1000/g;s/9/1001/g;
s/[Aa]/1010/g;s/[Bb]/1011/g;s/[Cc]/1100/g;s/[Dd]/1101/g;
s/[Ee]/1110/g;s/[Ff]/1111/g;
s/......../&:/g;s/^/:/;s/:[^:]*$//;
s/:/0/g;s/.../:&/g;
s/:000/0/g;s/:001/1/g;s/:010/2/g;s/:011/3/g;
s/:100/4/g;s/:101/5/g;s/:110/6/g;s/:111/7/g;
s/.../\\\\&/g;
' | xargs -n 1 printf
else
cat -- "$@" \
| od -A n -t x1 -v | tr 'abcdef' 'ABCDEF' | tr -C -d '0123456789ABCDEF' \
| fold -w 64
fi
#!/bin/sh
# To the extent possible under law, the author has waived all copyright
# and related or neighboring rights to this software by associating the
# CC0 1.0 (http://creativecommons.org/publicdomain/zero/1.0/) with it.
#
# base32 encoder/decoder.
# usage: base [-D] [filename ...]
# if -D is specified, it decodes input base32 stream.
# otherwise, it encodes input binary data in base32.
if [ "x$1" = "x-D" ]; then
shift 1
cat -- "$@" \
| tr -C -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\
| fold -w 64 | sed '
s/[Aa]/AAAAA/g;s/[Bb]/AAAAB/g;s/[Cc]/AAABA/g;s/[Dd]/AAABB/g;
s/[Ee]/AABAA/g;s/[Ff]/AABAB/g;s/[Gg]/AABBA/g;s/[Hh]/AABBB/g;
s/[Ii]/ABAAA/g;s/[Jj]/ABAAB/g;s/[Kk]/ABABA/g;s/[Ll]/ABABB/g;
s/[Mm]/ABBAA/g;s/[Nn]/ABBAB/g;s/[Oo]/ABBBA/g;s/[Pp]/ABBBB/g;
s/[Qq]/BAAAA/g;s/[Rr]/BAAAB/g;s/[Ss]/BAABA/g;s/[Tt]/BAABB/g;
s/[Uu]/BABAA/g;s/[Vv]/BABAB/g;s/[Ww]/BABBA/g;s/[Xx]/BABBB/g;
s/[Yy]/BBAAA/g;s/[Zz]/BBAAB/g;s/2/BBABA/g;s/3/BBABB/g;
s/4/BBBAA/g;s/5/BBBAB/g;s/6/BBBBA/g;s/7/BBBBB/g;
s/=*$//g;
s/......../&:/g;s/^/:/;s/:[^:]*$//;
s/:/A/g;s/.../:&/g;
s/:AAA/0/g;s/:AAB/1/g;s/:ABA/2/g;s/:ABB/3/g;
s/:BAA/4/g;s/:BAB/5/g;s/:BBA/6/g;s/:BBB/7/g;
s/.../\\\\&/g;
' | xargs -n 1 printf
else
cat -- "$@" | od -A n -t x1 -v | tr -C -d "0123456789abcdefABCDEF" \
| fold -w 80 | sed '
s/0/0000/g;s/1/0001/g;s/2/0010/g;s/3/0011/g;s/4/0100/g;
s/5/0101/g;s/6/0110/g;s/7/0111/g;s/8/1000/g;s/9/1001/g;
s/[aA]/1010/g;s/[bB]/1011/g;s/[cC]/1100/g;s/[dD]/1101/g;
s/[eE]/1110/g;s/[fF]/1111/g;
/./s/$/0000/;s/...../&:/g;s/:0*$/:/;
s/00000:/A/g;s/00001:/B/g;s/00010:/C/g;s/00011:/D/g;
s/00100:/E/g;s/00101:/F/g;s/00110:/G/g;s/00111:/H/g;
s/01000:/I/g;s/01001:/J/g;s/01010:/K/g;s/01011:/L/g;
s/01100:/M/g;s/01101:/N/g;s/01110:/O/g;s/01111:/P/g;
s/10000:/Q/g;s/10001:/R/g;s/10010:/S/g;s/10011:/T/g;
s/10100:/U/g;s/10101:/V/g;s/10110:/W/g;s/10111:/X/g;
s/11000:/Y/g;s/11001:/Z/g;s/11010:/2/g;s/11011:/3/g;
s/11100:/4/g;s/11101:/5/g;s/11110:/6/g;s/11111:/7/g;
/./s/$/=======/;s/......../&:/g;s/:=*$//;s/://g;
'
fi
#!/bin/sh
# To the extent possible under law, the author has waived all copyright
# and related or neighboring rights to this software by associating the
# CC0 1.0 (http://creativecommons.org/publicdomain/zero/1.0/) with it.
#
# base64 encoder/decoder
# usage: base [-D] [filename ...]
# if -D is specified, it decodes input base64 stream.
# otherwise, it encodes input binary data in base64.
if [ "x$1" = "x-D" ]; then
shift 1
cat -- "$@" \
| tr -C -d 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\
| fold -w 64 | sed '
s/A/AAAAAA/g;s/B/AAAAAB/g;s/C/AAAABA/g;s/D/AAAABB/g;
s/E/AAABAA/g;s/F/AAABAB/g;s/G/AAABBA/g;s/H/AAABBB/g;
s/I/AABAAA/g;s/J/AABAAB/g;s/K/AABABA/g;s/L/AABABB/g;
s/M/AABBAA/g;s/N/AABBAB/g;s/O/AABBBA/g;s/P/AABBBB/g;
s/Q/ABAAAA/g;s/R/ABAAAB/g;s/S/ABAABA/g;s/T/ABAABB/g;
s/U/ABABAA/g;s/V/ABABAB/g;s/W/ABABBA/g;s/X/ABABBB/g;
s/Y/ABBAAA/g;s/Z/ABBAAB/g;s/a/ABBABA/g;s/b/ABBABB/g;
s/c/ABBBAA/g;s/d/ABBBAB/g;s/e/ABBBBA/g;s/f/ABBBBB/g;
s/g/BAAAAA/g;s/h/BAAAAB/g;s/i/BAAABA/g;s/j/BAAABB/g;
s/k/BAABAA/g;s/l/BAABAB/g;s/m/BAABBA/g;s/n/BAABBB/g;
s/o/BABAAA/g;s/p/BABAAB/g;s/q/BABABA/g;s/r/BABABB/g;
s/s/BABBAA/g;s/t/BABBAB/g;s/u/BABBBA/g;s/v/BABBBB/g;
s/w/BBAAAA/g;s/x/BBAAAB/g;s/y/BBAABA/g;s/z/BBAABB/g;
s/0/BBABAA/g;s/1/BBABAB/g;s/2/BBABBA/g;s/3/BBABBB/g;
s/4/BBBAAA/g;s/5/BBBAAB/g;s/6/BBBABA/g;s/7/BBBABB/g;
s/8/BBBBAA/g;s/9/BBBBAB/g;s/+/BBBBBA/g;s,/,BBBBBB,g;
s/=*$//g;
s/......../&:/g;s/^/:/;s/:[^:]*$//;
s/:/A/g;s/.../:&/g;
s/:AAA/0/g;s/:AAB/1/g;s/:ABA/2/g;s/:ABB/3/g;
s/:BAA/4/g;s/:BAB/5/g;s/:BBA/6/g;s/:BBB/7/g;
s/.../\\\\&/g;
' | xargs -n 1 printf
else
cat -- "$@" | od -A n -t x1 -v | tr -C -d "0123456789abcdefABCDEF" \
| fold -w 96 | sed '
s/0/0000/g;s/1/0001/g;s/2/0010/g;s/3/0011/g;s/4/0100/g;
s/5/0101/g;s/6/0110/g;s/7/0111/g;s/8/1000/g;s/9/1001/g;
s/[aA]/1010/g;s/[bB]/1011/g;s/[cC]/1100/g;s/[dD]/1101/g;
s/[eE]/1110/g;s/[fF]/1111/g;
/./s/$/00000/;s/....../&:/g;s/:0*$/:/;
s/000000:/A/g;s/000001:/B/g;s/000010:/C/g;s/000011:/D/g;
s/000100:/E/g;s/000101:/F/g;s/000110:/G/g;s/000111:/H/g;
s/001000:/I/g;s/001001:/J/g;s/001010:/K/g;s/001011:/L/g;
s/001100:/M/g;s/001101:/N/g;s/001110:/O/g;s/001111:/P/g;
s/010000:/Q/g;s/010001:/R/g;s/010010:/S/g;s/010011:/T/g;
s/010100:/U/g;s/010101:/V/g;s/010110:/W/g;s/010111:/X/g;
s/011000:/Y/g;s/011001:/Z/g;s/011010:/a/g;s/011011:/b/g;
s/011100:/c/g;s/011101:/d/g;s/011110:/e/g;s/011111:/f/g;
s/100000:/g/g;s/100001:/h/g;s/100010:/i/g;s/100011:/j/g;
s/100100:/k/g;s/100101:/l/g;s/100110:/m/g;s/100111:/n/g;
s/101000:/o/g;s/101001:/p/g;s/101010:/q/g;s/101011:/r/g;
s/101100:/s/g;s/101101:/t/g;s/101110:/u/g;s/101111:/v/g;
s/110000:/w/g;s/110001:/x/g;s/110010:/y/g;s/110011:/z/g;
s/110100:/0/g;s/110101:/1/g;s/110110:/2/g;s/110111:/3/g;
s/111000:/4/g;s/111001:/5/g;s/111010:/6/g;s/111011:/7/g;
s/111100:/8/g;s/111101:/9/g;s/111110:/+/g;s,111111:,/,g;
/./s/$/===/;s/..../&:/g;s/:=*$//;s/://g;
'
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment