最少的代码干最多的活儿:一行搞定bash任意进制转换

sw
引言

Bash编程中,我们一般不需要把字符串格式化为十六进制。因为,十进制是给人类看的,而16进制则用于存储到计算机。

本文通过编程实践中所遇到的困难,引出进制转换的问题。然后给出解决方案。其中,格式化字符串,所用的元字符非常有用。

问题

有一个小哥在编程过程中,产生了一个疑问,他说,把十六进制的数值转换为十进制,似乎很容易。只用下面这个公式。

echo$((1631。

有个事儿你得多注意,这些转换是有限制的,比如ksh88,zshandpdksh基数支持到36,ksh93支持到64。

那么对于更大的数,怎么转换呢?这就需要用到bc/dc程序。

比如一个超长的数儿,发送解析式到bc:

echo'obase=16;9999999999999999999999'|bc

转换为16进制,结果为21E19E0C9BAB23FFFFF。

当然也可以使用dc程序:

echo'16o9999999999999999999999p'|dc

结果是一样的,就不再贴出来了。

bc/dc程序支持的基数从2到POSIX支持的数字,至少可达到99。对于大于16的基数,大于9的数字用空格分隔,由0前导填充的数表示。

echo'obase=30;123456'|bc

输出内容是这样的

04170506

使用dc的结果一样,请注意中间的空格,和前导0的填充。

写在最后

好吧,问1得10,夫复何求。连各种shell的差别都讲了,还有比这更用心的吗?

文章版权声明:除非注明,否则均为虚境探索者原创文章,转载或复制请以超链接形式并注明出处。

上一个 回合制RPG游戏推荐 不容错过的经典大作

下一个 两只企鹅在游戏里秀恩爱的下场是什么?