Linux
Bash - 將整數轉換、編碼為縮短的字母數字字元串
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