有人可以帮我一个十六进制数转换为十进制数在shell脚本?
例如,我想十六进制数转换bfca3000
使用shell脚本为十进制。 我基本上要两个十六进制数的差。
我的代码是:
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 "-")
从十六进制到十进制转换,有很多方法可以做到这在外壳或外部程序:
随着庆典 :
$ 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 -c 'print(int("FF", 16))'
255
与红宝石 :
$ 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 -e 'println Integer.parseInt("FF",16)'
255
在Linux上的busybox的一个非常轻量级的嵌入式版本处理意味着许多传统的命令不可用(BC,printf的,DC,PERL,Python)的
echo $((0x2f))
47
hexNum=2f
echo $((0x${hexNum}))
47
感谢彼得·梁对这个解决方案。
使用shell(bash或ksh的,不与前围工作)做另一种方式:
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
命令是“台计算”。 它也将采取输入从标准输入,像bc
,但不是使用“操作顺序”,它采用堆叠(“逆波兰”)符号。 你给它输入其添加到堆栈,然后给它,弹出项目从堆栈中运营商和回推的结果。
在上面的命令我们有以下几点:
-
16i
-告诉直流接受底座16(十六进制)的输入。 不改变输出基地。 -
BFCA3000
-您最初的数 -
17FF
-我拿起一个随机十六进制数从您最初的数减去 -
-
-拿我们推的两个数字,并减去从前面一个后面一个,那么结果回推到堆栈 -
p
-打印堆栈上的最后一个项目。 这不会改变栈,所以... -
10o
-告诉直流到打印基地“10”的输出,但请记住,我们的输入编号方案是目前的十六进制,所以“10”的意思是“16”。 -
p
-打印的最后一个项目在栈上再次...这一次是在十六进制。
您可以构建具有直流惊人复杂的数学解决方案。 这是一个很好的事情在你的工具箱中的shell脚本。
当变量是空(或空)作为报告的错误显示为:
$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")
这可能发生,因为给BC值是不正确的。 这很可能是公元前需要大写值。 它需要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位数学来表示,作为差异在bash计算在原来的剧本。 击被限制为小于((2 ** 63)-1),如果编译以64位整数。 这将是与卑诗省唯一的差别不具有这样的限制。
在仪表板和其他炮弹,你可以使用
printf "%d\n" (your hexadecimal number)
为十六进制数转换为十进制。 这不是bash中,或ksh,具体。