Shell进制转换小结

I-III部分只涉及bash……

关于其他,请参看IV部分……

I: 利用obase, ibase和bc:

        ibase是输入数字的进制,而obase就是输出数字的进制了。很好记,i是input,o是output。
注意,16进制数字的F要大写, 否则,结果为0,是错误的。

举例说明:

10进制转2进制:


10进制转16进制: (如果输入是10进制的话,ibase可省略)


16进制转2进制:


16进制转10进制:(此时,只需指定ibase即可)


II: 利用echo的base#:

$((base#number))
#其中number是欲转化的数,base是其进制数.(base也可省略,number默认是十进制,如果以0,或0x则分别是八进制和十六进制).

  1. #echo $((012)) #8进制,结果为10   
  2. #echo $((0xFF)) #16进制,结果为255   
  3. #echo $((0xEF))   
  4. #echo $((0xFFFF))   
  5. #echo $((2#1101011))   
  6. #echo $((2#11111111)) #2进制,结果为255   
  7. #echo $((8#255)) #8进制,结果为173   
  8. #echo $((8#377)) #16进制,结果为217   
  9. #echo $((16#D9))   
  10. #echo $((16#FF)) #有base不用0x,不然报错!8进制没问题!  

另外这个用法还可以扩展:

$((base#number^base#Base1)) #可以理解为number和Base1这两者按照base进制做了个异或操作.

比如:

  1. #base=1f  
  2. #Base1=ff  
  3. #echo $((16#$base^16#$Base1))   
  4. 224   
  5. #这个例子就表示,base(1f)和Base1(ff)按照16进制做了异或操作(结果为e0,即224)  

III: 例子:

Question:

现在想对两个二进制数据进行 或 运算, 如
a= 1101
b= 1000
c= a|b
以二进制格式输出c = 1101 ???

Answer:

  1. [Bob@hzling08:~]-No.96-$ a=1101b=1000  
  2. [Bob@hzling08:~]-No.97-$ d=`echo $(($((2#$a))|$((2#$b)))) | bc`   
  3. [Bob@hzling08:~]-No.98-$ echo "obase=2; $d" | bc                 
  4. 1101  

其实可以写成一句:

  1. [Bob@hzling08:~]-No.99-$ echo "obase=2;$(($((2#$a))|$((2#$b))))" | bc   
  2. 1101  

IV: 补充:

1. 利用awk:

  1. #十六进制转十进制   
  2. echo 0x2A | gawk '$1=strtonum($1)'   
  3.   
  4. #科学计数法转十进制   
  5. printf "%f\n" 3.1188622400e+06   
  6. echo 3.1188622400e+06 | awk '{printf("%f\n",$0)}'   
  7.   
  8. #科学计数法转十进制并保留两位小数   
  9. echo 3.1188622400e+06 | awk '{printf("%.2f\n",$0)}'   
  10.   
  11. #科学计数法转十进制并取整   
  12. printf "%.f\n" 3.1188622400e+06   
  13. echo 3.1188622400e+06 | awk '{printf("%d\n",$0)}'   
  14.   
  15. #科学计数法转十进制并四舍五入取整   
  16. echo 3.1188622400e+06 | awk '{printf("%d\n",$0+0.5)}'  

2.ksh中:

  1. #ksh中的进制转换   
  2. num=42   
  3. typeset -i2 num   
  4. echo $num  
  5. typeset -i8 num   
  6. echo $num  
  7. typeset -i16 num   
  8. echo $num  

V: 其他

此外,dc也可以办到,如:

  1. echo 255 16op|dc   
  2. FF  


下面是一个将输入的十六进制数值转换为10进制数:

./hexconvert.sh 0xFF

255

vim hexconvert.sh


实例参考实现:详见《Advanced Bash-Scripting Guide》高级Bash脚本编程指南12-46. 将10进制数字转换为16进制数字

    shell可以在不调用第3方命令,表示不同进制数据。这里总结以下表示方法。shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值。如:以 0 开头就是 8 进制.以0x 开头就是16 进制数.使用 BASE#NUMBER 这种形式可以表示其它进制.BASE值:2-64.

 

使用方法:

  • 其它进制转为10进制

八进制转十进制:

[chengmo@centos5 ~]$ ((num=0123));
[chengmo@centos5 ~]$ echo $num;
83

[chengmo@centos5 ~]$ ((num=8#123));
[chengmo@centos5 ~]$ echo $num;    
83

((表达式)),(())里面可以是任意数据表达式。如果前面加入:”$”可以读取计算结果。

十六进制转十进制:

[chengmo@centos5 ~]$ ((num=0xff)); 
[chengmo@centos5 ~]$ echo $num;    
255
[chengmo@centos5 ~]$ ((num=16#ff));
[chengmo@centos5 ~]$ echo $num;    
255

base-32转十进制:

[chengmo@centos5 ~]$ ((num=32#ffff));
[chengmo@centos5 ~]$ echo $num;      
507375

base64转十进制:

[chengmo@centos5 ~]$ ((num=64#abc_)); 
[chengmo@centos5 ~]$ echo $num;       
2667327

二进制转十进制

[chengmo@centos5 ~]$ ((num=2#11111111));  
[chengmo@centos5 ~]$ echo $num;
255

 

  • 十进制转为其它进制

十进制转八进制

这里使用到:bc外部命令完成。bc命令格式转换为:echo "obase=进制;值"|bc

[chengmo@centos5 ~]$ echo "obase=8;01234567"|bc
4553207

二进制,十六进制,base64转换为 十进制也相同方法。

[chengmo@centos5 ~]$ echo "obase=64;123456"|bc  
30 09 00

 

shell,内置各种进制表示方法非常简单。记得base#number 即可。这里记得赋值时候用(())符号。不能直接用=号了。=号没有值类型。默认将后面变成字符串了。如:

[chengmo@centos5 ~]$ num=0123;
[chengmo@centos5 ~]$ echo $num;
0123

0开头已经失去了意义了。

可以通过定义符:let达到(()) 运算效果。

[chengmo@centos5 ~]$ let num=0123;
[chengmo@centos5 ~]$ echo $num;   
83

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Example 12-46 将10进制数字转换为16进制数字
################################Start Script#######################################
 1 #!/bin/bash
 2 # hexconvert.sh: 将10进制数字转换为16进制数字
 3 
 4 E_NOARGS=65 # 缺命令行参数错误.
 5 BASE=16     # 16进制.
 6 
 7 if [ -z "$1" ]
 8 then
 9   echo "Usage: $0 number"
10   exit $E_NOARGS
11   # 需要一个命令行参数.
12 fi
13 # 练习: 添加命令行参数检查.
14 
15 
16 hexcvt ()
17 {
18 if [ -z "$1" ]
19 then
20   echo 0
21   return    # 如果没有参数传递到这个函数中就 "return" 0.
22 fi
23 
24 echo ""$1" "$BASE" o p" | dc
25 #                 "o" 设置输出的基数(数制).
26 #                   "p" 打印栈顶.
27 # 察看 dc 的 man 页来了解其他的选项.
28 return
29 }
30 
31 hexcvt "$1"
32 
33 exit 0


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值