写于: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认为是变量。