Linux

Bash - 將整數轉換、編碼為縮短的字母數字字元串

  • October 19, 2017

BASH 中有沒有辦法將整數轉換為縮短的字母數字字元串?

如果我開始,讓我們說 with var=20171019194210。我想得到類似以下的東西。

echo "$var" | encoding
a4f5e6g

進而:

echo "$var" | decoding
20171019194210

在 Stackoverflow 上的 Python 中找到了一些東西;但是,如果可能的話,我更願意將 BASH 與 GNU 工具的任意組合一起使用awk

我正在嘗試通過如下創建時間戳來為文件創建唯一 ID。

date +"%Y%m%d%H%M%S"

然後,我在文件名中包含此時間戳以辨識系統上的文件,而無需使用整個文件名,或者能夠在沒有文件名的其餘部分的情況下辨識文件。

我現在想縮短或編碼這個整數,使其在長度方面更有用,但同樣可以重新計算時間戳值。

這是在 bash 中,所以它會很慢。它將 2 個數字映射到 1 個字元。它使用 base64 字母表,因此它只能容納 0 到 63 之間的數字——小時、分鐘、秒、天和月都可以,但將在 2064 年停止工作。map使用更多字元來擴展它。

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

引用自:https://unix.stackexchange.com/questions/399181