使用 bc 命令进行进制转换
ibase 设置 input base,必须是 2 ~ 16 之间的数字,对于十六进制,ABCDEF 等字母必须要大写。
obase 设置 output base,2 ~ 16 进制就用普通的表示方法,如果大于 16,则用多个字符来表示一个数字,数字之间用空格间隔。
如果 ibase 和 obase 不指定,则默认是 10 进制。
一般先设置 obase,再设置 ibase,否则先设置的 ibase 会对后面设置的 obase 参数生效,有可能会导致结果与预期不符,后面有示例。
示例如下:
1、10 进制转 2 进制
$ echo "obase=2;1024" | bc
10000000000
2、10 进制转 8 进制
$ echo "obase=8;16" | bc
20
3、10 进制转 16 进制
$ echo "obase=16;32" | bc
20
4、10 进制转 base64
$ echo "obase=64;12345" | bc
03 00 57
6、2 进制转 16 进制
$ echo "obase=16; ibase=2; 11111111"|bc
7、先设置 ibase,再设置 obase 的问题,
$ echo "ibase=2;obase=16; 11111111"|bc
100110
为啥结果是 100110,而不是 FF,因为 ibase=2 对 obase=16 生效了,那 16 的 10 进制结果是 1 * 2 + 1 * 1(6 > 2,变成 2 - 1),变成 obase=3,所以其实是以 3 进制输出的结果,可以验证下,
$ echo "obase=3;ibase=2; 11111111"|bc
100110
如果先设置 obase=16,再设置 ibase=2,则结果符合预期,
$ echo "obase=16;ibase=2; 11111111"|bc
FF
参考
Understand "ibase" and "obase" in case of conversions with bc? - Unix & Linux Stack Exchange