写于:2017-11-14 最近一次更新:2017-11-14
Intent:
使用bc进行进制转换
Trouble:
obase和ibase参数指定顺序不一样,得到的结果竟然不一样
指定了obase和ibase参数后再调整obase和ibase参数,竟然得不到正确的结果
Oneway:
$ echo 'obase=8;ibase=16;7F0F0106' | bc # 16进制转换为8进制
17703600406
Details:
如果使用10进制的数字指定进制,格式必须为先指定obase,再指定ibase,
且必须在指定obase和ibase之后再输入待转换的数字,
格式的顺序不能改变,否则会得到错误的结果,本质原因如下
在指定ibase和obase的进制之前,bc默认使用的是10进制,
一旦指定了ibase的进制则后续输入的所有数字都会被bc认为
是ibase指定的进制(包括初次赋值给obase等参数的数字
和后续调整obase和ibase时的数字)。
举个例子给你看,将8进制数字17703600406 转换为16进制,
以下4条命令中第1,3条才是正解,第2,4条是错误的
正解 $ echo 'obase=16;ibase=8;17703600406' | bc
7F0F0106
错误 $ echo 'ibase=8;obase=16;17703600406' | bc
163178C06
正解 $ echo 'ibase=8;obase=20;17703600406' | bc # 8进制的20等于10进制的16
7F0F0106
错误 $ echo 'ibase=8;17703600406;obase=20' | bc
2131689734
另外,需要转换的数字中的字母必须大写,否则bc会报错,
因为小写字母会被bc认为是变量。
|