Isso está no bash, então será lento. Ele mapeia 2 números para 1 caractere. Ele usa o alfabeto base64, portanto, só pode acomodar números entre 0 e 63 - não há problema em horas, minutos, segundos, dias e meses, mas vai parar de funcionar em 2064. Estenda o map
com mais caracteres para estendê-lo. / p>
declare -a map=(
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 + /
)
declare -A revmap
for ((i=0; i<${#map[@]}; i++)); do revmap[${map[i]}]=$(printf "%02d" $i); done
encode() {
local i result=""
for ((i=0; $i < ${#1}; i+=2)); do
# specifies base 10 numbers to prevent attempted interpretation
# of invalid octal numbers 08,09
result+=${map[10#${1:i:2}]:-"?"}
done
echo "$result"
}
decode() {
local i result=""
for ((i=0; i<${#1}; i++)); do
result+=${revmap[${1:i:1}]:-"??"}
done
echo "$result"
}
encode 20171019194210 # => URKTTqK
decode $(encode 20171019194210) # => 20171019194210
encode 20671019194210 # => U?KTTqK
# .......^^
decode "$(encode 20671019194210)" # => 20??1019194210