我想检查一下Base64整数值。有一个base64
linux 命令,但我不明白如何将它应用于整数。
我尝试过base64 10
,但随后收到错误消息base64: 10: No such file or directory
我认为问题可能在于 Base64 用于二进制到文本的转换,因此没有必要向其传递文本参数。所以我的论点10
被读取为文本字符串而不是二进制数。有什么方法可以将文本参数转换为二进制吗?
如何使用 base64 命令获取整数的 Base64 值?
答案1
将数字转换为十六进制,然后用于echo
打印相应的字节序列并将其通过管道传输到base64
.因此,要使用 base64 对整数 10 进行编码,您可以使用:
echo -en '\xA' | base64
来解释一下结果。字节 10 具有以下二进制表示形式:
00001010
Base64 的作用是将这些数据分成 6 位组。因此,通过填充,我们得到以下两个 6let:
000010 100000
十进制表示为2和32,分别对应字母C和g。
答案2
下面的命令将十进制整数转换为基数 64。它不使用 Base64 编码方案,但使用 Base64 编码方案的 URL 安全变体所使用的字符作为数字。
awk 'NR==FNR{a[NR-1]=$0;next}{if($0==0){print"A";next}o="";for(n=$0;n!=0;n=int(n/64))o=a[n%64]o;print o}' <(printf %s\\n {A..Z} {a..z} {0..9} - _) -
下面的命令在 Bash 中执行相同的操作。如果您替换l%64
为 .Zsh ,它也适用于 Zsh l%64+1
。
unset a;a=({A..Z} {a..z} {0..9} - _);while IFS= read l;do if ((l==0));then echo A;continue;fi;o=;for ((;l!=0;l/=64));do o=${a[l%64]}$o;done;printf %s\\n "$o";done
这会将基数 64 转换为十进制:
awk 'NR==FNR{a[$0]=NR-1;next}{o=0;for(i=NF;i>=1;i--)o+=a[$i]*64^(NF-i);print o}' FS= <(printf %s\\n {A..Z} {a..z} {0..9} - _) -
这在 Bash 中执行相同的操作:
unset a;i=0;declare -A a;for x in {A..Z} {a..z} {0..9} - _;do a[$x]=$((i++));done;while IFS= read l;do o=0;for((i=${#l};i>=1;i--));do let o+=${a[${l:i-1:1}]}*64**(${#l}-i);done;echo "$o";done
这些awk
命令会导致2**53+1
数字和更大的精度损失,但为了避免这种情况,您可以在4.1 及更高版本中添加-M
( --bignum
) 。gawk
Bash 命令会导致整数溢出2**63
和更大的数字。