在Shell脚本中hex为十进制
有人可以帮助我告诉如何将一个hex数字转换为一个shell脚本中的十进制数字? 例如,我想要使用shell脚本将hex数bfca3000
转换为十进制。 我基本上想要两个hex数字的区别。 我的代码是:
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 "%d\n" 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<<EOF print(parseInt('FF', 16)) EOF ... 255
与groovy :
$ groovy -e 'println Integer.parseInt("FF",16)' 255
在Linux上处理一个非常轻量级的busyboxembedded式版本意味着许多传统命令不可用(bc,printf,dc,perl,python)
echo $((0x2f)) 47 hexNum=2f echo $((0x${hexNum})) 47
感谢Peter Leung提供的解决scheme。
还有一种方法可以使用shell(bash或ksh,不能用破折号):
echo $((16#FF)) 255
您可以从一个shell内使用各种工具。 根据你最初的问题,Sputnick已经给你一个很好的选项概述。 他绝对值得的投票时间,他花了给你多个正确的答案。
还有一件不在他的名单上:
[ghoti@pc ~]$ dc -e '16i BFCA3000 p' 3217698816
但是,如果你想要做的只是减去,为什么麻烦改变input到基地10?
[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p' 3217692673 BFCA1801 [ghoti@pc ~]$
dc
命令是“desk calc”。 它也将采用stdin的input,如bc
,但是不使用“操作顺序”,而是使用堆栈(“逆波兰”)符号。 你给它添加到堆栈的input,然后给操作员从堆栈中popup项目,并推回结果。
在上面的命令中,我们得到了以下内容:
-
16i
– 告诉dc接受基地16(hex)的input。 不改变输出基地。 -
BFCA3000
– 您的初始号码 -
17FF
– 一个随机的hex数字,我select从您的初始数字减去 -
-
取两个我们推过的数字,从后面的数字中减去,然后把结果推回栈中 -
p
– 打印堆栈中的最后一个项目。 这不会改变堆栈,所以… -
10o
– 告诉dc在“10”的基础上打印输出,但请记住,我们的input编号scheme目前是hex的,所以“10”的意思是“16”。 -
p
– 再次打印堆栈中的最后一个项目…这次是hex。
你可以用直stream构造非常复杂的math解决scheme。 在shell脚本的工具箱中,这是一件好事。
报告的错误出现在variables为空(或空)时:
$ unset var3 var4; var5=$(($var4-$var3)) bash: -: syntax error: operand expected (error token is "-")
这可能会发生,因为提供给bc的值是不正确的。 这很可能是因为BC需要UPPERcase值。 它需要BFCA3000
,而不是bfca3000
。 这很容易在bash中修复,只需使用^^
扩展:
var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`
这将改变这个脚本:
#!/bin/bash var1="bfca3000" var2="efca3250" var3="$(echo "ibase=16; ${var1^^}" | bc)" var4="$(echo "ibase=16; ${var2^^}" | bc)" var5="$(($var4-$var3))" echo "Diference $var5"
但是没有必要使用bc [1],因为bash可以直接执行转换和减法:
#!/bin/bash var1="bfca3000" var2="efca3250" var5="$(( 16#$var2 - 16#$var1 ))" echo "Diference $var5"
[1] 注意:我假设这些值可以用64位math表示,因为差异是在原始脚本中用bash计算的。 如果以64位编译,则Bash被限制为小于((2 ** 63)-1)的整数。 这与bc唯一的区别是没有这个限制。
在短跑和其他贝壳,你可以使用
printf "%d\n" (your hexadecimal number)
将hex数转换为十进制数 这不是bash,或ksh,具体。