O comando abaixo converte um inteiro decimal para a base 64. Ele não usa o esquema de codificação Base64, mas usa os caracteres usados pela variante segura para URL do esquema de codificação Base64 como dígitos.
awk 'NR==FNR{a[NR-1]=$0;next}{if($0==0){print"A";next}o="";for(n=$0;n!=0;n=int(n/64))o=a[n%64]o;print o}' <(printf %s\n {A..Z} {a..z} {0..9} - _) -
O comando abaixo faz o mesmo no Bash. Ele também funciona com o Zsh se você substituir l%64
por l%64+1
.
unset a;a=({A..Z} {a..z} {0..9} - _);while IFS= read l;do if ((l==0));then echo A;continue;fi;o=;for ((;l!=0;l/=64));do o=${a[l%64]}$o;done;printf %s\n "$o";done
Isso converte o radix 64 em decimal:
awk 'NR==FNR{a[$0]=NR-1;next}{o=0;for(i=NF;i>=1;i--)o+=a[$i]*64^(NF-i);print o}' FS= <(printf %s\n {A..Z} {a..z} {0..9} - _) -
Isso faz o mesmo no Bash:
unset a;i=0;declare -A a;for x in {A..Z} {a..z} {0..9} - _;do a[$x]=$((i++));done;while IFS= read l;do o=0;for((i=${#l};i>=1;i--));do let o+=${a[${l:i-1:1}]}*64**(${#l}-i);done;echo "$o";done
Os comandos awk
resultam em perda de precisão com 2**53+1
e números maiores, mas para evitá-lo você pode adicionar -M
( --bignum
) em gawk
4.1 e posterior.
Os comandos Bash resultam em estouro de inteiro com 2**63
e números maiores.