12

bash次のコマンドで実行される操作を元に戻したい:

$ echo $((62#a39qrT))
9207903953

つまり、10 進数の 9207903953基数 62に変換し、bash標準を{0..9},{a..z},{A..Z}.

を使用してこれを実行できることはわかっていますがbc、各文字を手動で変換する必要があります。たとえば、私は現在これを行っています:

BASE62=($(echo {0..9} {a..z} {A..Z}))
for i in $(echo "obase=62; 9207903953" | bc)
do
    echo -n ${BASE62[$i]} #Doesn't work if bc's output contains leading zeroes
done

これを「ハッカー」の少ない方法で行う方法が必要です。これをより効率的に行う方法を知っていますか?

編集:bc入力を変更しました。

4

4 に答える 4

12

あなたが思いついた解決策に本当に感謝しています.bashで直接回避する方法はないと思います. あなたが見逃した小さなポイントは次のとおりです。

BASE62=($(echo {0..9} {a..z} {A..Z}))
for i in $(bc <<< "obase=62; 9207903953"); do
    echo -n ${BASE62[$(( 10#$i ))]}
done && echo

出力:

a39qrT
于 2013-01-23T04:14:59.223 に答える
1

gforth, およびtr,を使用した任意の base10 から baseX への変換関数( base を出力するために異なる文字を使用するtrため必要です):gforthbash

n2b() { gforth -e "$1 $2 base ! . cr bye" | tr '[0-9A-z]' '[0-9a-zA-Z]' ; }
n2b 9207903953 62
n2b 9207903953 61   # Also works with other bases.
n2b 9207903953 3

出力:

a39qrT 
aT1PM8
212202201021222121202
于 2017-05-12T20:24:08.123 に答える