bash - 在 shell script 中,十六进制到十进制

谁能帮助我在shell script中将十六进制数字转换为十进制数? 例如,我想使用shell script将十六进制数字bfca3000转换为十进制数,我的代码是:


var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]

执行时,我将得到以下错误:


Line 48: -: syntax error: operand expected (error token is "-")

时间:

要转换hex2dec,可以在shell或脚本中执行以下操作:

使用bash


$ echo $((16#FF))
255

使用bc


$ echo "ibase=16; FF" | bc
255

使用perl


$ perl -le 'print hex("FF");'
255

使用printf


$ printf "%dn" 0xFF
255

使用python


$ python -c 'print(int("FF", 16))'
255

使用ruby


$ ruby<<EOF
p "FF".to_i(16).to_s(10)
EOF
"255"

使用node.js


$ nodejs <<< "console.log(parseInt('FF', 16))"
255

使用rhino


$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255

使用groovy


$ groovy -e 'println Integer.parseInt("FF",16)'
255

在Linux上轻量级的嵌入式版本的busybox中处理,意味着很多传统的命令(python,printf,dc,perl )都不能用,


echo $((0x2f))
47

hexNum=2f
echo $((0x${hexNum}))
47

感谢Peter解决此问题。

使用shell (bash或ksh,与dash不兼容)执行以下操作:

 
echo $((16#FF))
255

 

在一个外壳中可以使用各种工具。 Sputnick根据你的初始问题为你提供了一个极好的概述。 他绝对应该为你提供多个正确答案的时间投票。

还有一个不在他的名单上:


[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816

但是如果你想做的就是减掉,为什么要把输入改为 10?


[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$ 

dc 命令是"计算器计算器"。 它也将从stdin输入输入,比如 bc,而不是使用"操作顺序",它使用堆叠("") 表示法。 你给它添加它添加到堆栈中的输入,然后让它的操作符从堆栈中弹出项目,并返回结果。

在上面的命令中,我们得到了以下内容:

  • 16i --通知dc接受基 16 ( 十六进制) 中的输入。 不更改输出基。
  • BFCA3000 --,你的初始号码
  • 17FF --一个随机的十六进制数字,我从你的初始数字中减去
  • - --获取我们已经推过的两个数字,然后从前面的那个数字减去,然后将结果推回堆栈
  • p --打印堆栈上最后一个项目。 这不会改变堆栈,所以,。
  • 10o --告诉dc在基" 10"中输出输出,但记住我们的输入数字方案是十六进制的,所以" 10"意味着" 16"。
  • p --打印堆栈上最后一个项目。 这次以十六进制形式。

你可以用dc构造非常复杂的数学解决方案。 在你的工具箱中包含shell脚本是一件好事。

...