我想要反转以下bash
命令执行的操作:
$ echo $((62#a39qrT))
9207903953
即。将十进制9207903953 转换为 base 62 ,保持bash
的{{1}}标准。
我知道我可以使用{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
输入。
答案 0 :(得分:9)
我真的非常感谢你提出的解决方案,我想用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
答案 1 :(得分:2)
function base62encode() {
bc<<<"obase=62;$1" | awk '{for (i=1; i<=NF; i++) printf "%c", $i+(($i<10)?48:(($i<36)?87:29))}'
}
bc<<<"obase=62;$1"
转换为从00到61 或没有for循环:
function base62encode() {
bc<<<"obase=62;$1" | awk 'BEGIN{RS=" +"}/./{printf "%c", $1+(($1<10)?48:(($1<36)?87:29))}';
}
答案 2 :(得分:1)
使用gforth
的任意base10到baseX转换功能,tr
需要tr
,因为gforth
和bash
使用不同的字符来打印基础:
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
答案 3 :(得分:0)
或者没有bc和任意基础:
function baseXencode() {
awk 'BEGIN{b=split(ARGV[1],D,"");n=ARGV[2];do{d=int(n/b);i=D[n-b*d+1];r=i r;n=d}while(n!=0);print r}' "$1" "$2"
}
function base62encode() {
baseXencode 0123465789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "$1"
}