我是@程序员小助手Rman,仅次于Xman,Ironman,Superman。

引言

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

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

问题

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

echo $((16#55))

输出为 85。

那么问题来了。如果反向操作该怎么办呢?

方案

使用bash,或任何shell,通畅都提供了 printf 方法,这是在shell中构建的标准POSIX命令。

只需运行下面这个函数,

printf '%x' 85

输出内容 55。

在 zsh 中你可以这么写:

dec=85hex=$(([##16]dec))

这种方法,对于2-36的基数,都是有效的。不过数位支持0-9a-z这些字符罢了。

在 ksh93 中你可以这么写:

dec=85base54=$(printf %..54 "$dec")

这个支持的基数更大,从2-64,支持的字符也就多了 0-9a-zA-Z@_。

在 ksh,zsh中,还能这么写:

typeset -i34 x=123; echo "$x"

这个是把十进制数123转换为基数为34的值,结果输出 34#31。

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

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

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

echo 'obase=16; 9999999999999999999999' | bc

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

当然也可以使用 dc 程序:

echo '16o 9999999999999999999999 p' | dc

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

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

echo 'obase=30; 123456' | bc

输出内容是这样的

04 17 05 06

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

写在最后

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

Happy coding :)

linux shell 十进制转十六进制_问1得10:shell十进制转换到任意进制,多大事儿,一行搞定!相关推荐

  1. 使用递归将十进制转换成任意进制(Number Conversion)

    关于递归 什么是递归? 说白了,就是函数自己调用自己,然后被调用的函数继续调用自己,这将无限循环下去,除非代码中有终止调用链的的内容. 解释一下递归的所经历的过程 递归需要有边界条件.递归前进段和递归 ...

  2. 十进制的转换与任意进制的互转

    一.十进制转任意进制: 十进制转任意进制时,将这个十进制数除以进制数,比如2(也就是十进制转二进制),得到商和一个从0~1的余数,然后再以这个商为被除数,除了进制数2,继续得到商和一个从0~1的余数. ...

  3. 进制转换【最全进制转换汇总】(整数_小数_正数_负数)正负数整数小数十进制转任意进制-正负数整数小数任意进制转十进制-正负数低进制转高进制-正负数高进制转低进制

    文章目录: 补充知识点:各进制符号表示及其关系--二进制(B).八进制(O).十进制(D).十六进制(前缀OX,后缀H) 扩展:在线进制转换 第一部分:正数 一:[整数]正数十进制转任意进制:辗转相除 ...

  4. 任意进制转换成十进制间互化(ASCII码法)(C/C++)

    目录 1 最早的版本(C) 2  针对上面的问题进行改进(C++) 2.1  任意进制转换成十进制(运用字符串) 2.2  十进制转换成任意进制(运用数组逆序存储+取模作除法) 3  ASCII码参考 ...

  5. 语言栈十进制转十六进制_十进制数转二进制、八进制、十六进制等任意进制_C语言「抄作业」...

    C语言「抄作业」系列之十进制数转二进制.八进制.十六进制等任意进制 PS: 写这篇时发现了潜藏多年的Bug.在修复时,无意间发现,本大仙当年的Bug代码竟然「流传甚广」--(别以为改了下变量名,就能骗 ...

  6. 任意进制转换为十进制(十六进制转换为十进制)

    一.十六进制转换为十进制 unsigned long HextoDec(char *hex, int length) {int i;unsigned long rslt = 0;for (i = 0; ...

  7. JS将十进制转换为二进制、十六进制、八进制,任意进制

    JS将十进制转换为2进制.16进制.8进制,任意进制 转换为二进制 let n = 1234; console.log(n.toString(2)); 转换为十六进制 let n = 1234; co ...

  8. c语言中十六进制可以直接和十进制运算吗,十进制与十六进制怎么理解?,C语言中十进制数和十六进制数能直接运算吗...

    16进制 10进制 00 0 01 1 02 2 .. . 09 9 0A 10 0B 11 0C 12 0D 13 0E 14 0F 15 10 16 1F 31 20 32 将数字符号按序排列成数 ...

  9. java非负整数怎么设_使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法...

    使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法 使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法 一.题目要求 将非负十进制整数n转换成b进制.(其中b=2~16) ...

最新文章

  1. 多传感器融合之滤波(二)EKF
  2. 你不知道的CSS单位
  3. 大数据读书笔记(2)-流式计算
  4. DevExpress的GridControl的使用以及怎样添加列和绑定数据源
  5. php加密登录_PHP写一个简单的网页加密认证
  6. SAP Fiori elements第二次重复加载的问题
  7. Angular 根据指定条件动态决定是否显示自定义的popup hover Component
  8. [转载] java如何实现一个字符串的反转和替换
  9. 进销存ERP源码 进销存APP源码 带小程序ERP源码
  10. 「超级右键」Mac上最强的右键菜单工具,让你效率飞起!
  11. MATLAB三维图像与三重积分
  12. yum配置代理proxy
  13. 禅意设计:网络简洁设计的缘起和未来
  14. 学生查分系统该怎么制作?
  15. matlab pxi采集卡,PXI-2527采集卡
  16. 【工作记录】支付系统数据库梳理
  17. MATLAB|awgn函数的说明
  18. 计算机语言恢复,如何将win7电脑中不见的语言栏恢复回来?
  19. 机器视觉面试宝典--深度学习补缺补漏篇
  20. python图像的几何运算_python中图像的几何扭曲

热门文章

  1. c#读取生成excel表格文件xls、xlsx格式文件
  2. (四)pscc学习笔记
  3. 用Mask-RCNN训练自定义大小的数据集
  4. 7.25 8figting!
  5. 使用jdk的xjc命令由schema文件生成相应的实体类
  6. HDU--1054--Strategic Game【最小点覆盖】
  7. javaScript = == ===的区别
  8. JAVA 1.5 并发之 Executor框架 (内容为转载)
  9. Cassandra 之旅 (二) Getting Started
  10. WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证