Ven*_*hJN 120 bash shell hex decimal
有人可以帮我在shell脚本中将十六进制数转换为十进制数吗?
例如,我想bfca3000
使用shell脚本将十六进制数转换为十进制数.我基本上想要两个十六进制数的差异.
我的代码是:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
Run Code Online (Sandbox Code Playgroud)
执行时,我收到此错误:
Line 48: -: syntax error: operand expected (error token is "-")
Run Code Online (Sandbox Code Playgroud)
Gil*_*not 293
要从十六进制转换为十进制,有很多方法可以在shell中或使用外部程序执行此操作:
用bash:
$ echo $((16#FF))
255
Run Code Online (Sandbox Code Playgroud)
与bc:
$ echo "ibase=16; FF" | bc
255
Run Code Online (Sandbox Code Playgroud)
用perl:
$ perl -le 'print hex("FF");'
255
Run Code Online (Sandbox Code Playgroud)
与printf:
$ printf "%d\n" 0xFF
255
Run Code Online (Sandbox Code Playgroud)
用python:
$ python -c 'print(int("FF", 16))'
255
Run Code Online (Sandbox Code Playgroud)
用红宝石:
$ ruby -e 'p "FF".to_i(16)'
255
Run Code Online (Sandbox Code Playgroud)
与node.js:
$ nodejs <<< "console.log(parseInt('FF', 16))"
255
Run Code Online (Sandbox Code Playgroud)
与犀牛:
$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255
Run Code Online (Sandbox Code Playgroud)
与groovy:
$ groovy -e 'println Integer.parseInt("FF",16)'
255
Run Code Online (Sandbox Code Playgroud)
hin*_*yle 36
在Linux上处理非常轻量级的busybox嵌入式版本意味着许多传统命令不可用(bc,printf,dc,perl,python)
echo $((0x2f))
47
hexNum=2f
echo $((0x${hexNum}))
47
Run Code Online (Sandbox Code Playgroud)
感谢彼得·梁对这个解决方案.
Tom*_*Fox 13
使用shell的另一种方法(bash或ksh,不能使用破折号):
echo $((16#FF))
255
Run Code Online (Sandbox Code Playgroud)
gho*_*oti 11
在shell中可以使用各种工具.根据您的初步问题,Sputnick为您提供了很好的选择概览.他绝对值得投票给他给你多个正确答案的时间.
还有一个不在他的名单上:
[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816
Run Code Online (Sandbox Code Playgroud)
但是如果你想要做的就是减去,为什么还要把输入更改为10?
[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$
Run Code Online (Sandbox Code Playgroud)
该dc
命令是"桌面计算".它也会从stdin中获取输入bc
,但不是使用"操作顺序",而是使用堆叠("反向波兰")表示法.你给它添加到堆栈的输入,然后给它操作员弹出堆栈中的项目,然后推回结果.
在上面的命令中,我们得到以下内容:
16i
- 告诉dc接受基数为16(十六进制)的输入.不改变输出基数.BFCA3000
- 你的初始号码17FF
- 我选择的随机十六进制数字从您的初始数字中减去-
- 取出我们推送的两个数字,然后从前一个数字中减去后一个数字,然后将结果推回堆栈p
- 打印堆栈中的最后一项.这不会改变堆栈,所以......10o
- 告诉dc以基数"10"打印其输出,但请记住我们的输入编号方案当前是十六进制的,因此"10"表示"16".p
- 再次打印堆栈中的最后一项...这次是十六进制.您可以使用dc构建非常复杂的数学解决方案.在shell脚本的工具箱中使用它是一件好事.
nov*_*ice 10
在 dash 和其他 shell 中,您可以使用
printf "%d\n" (your hexadecimal number)
Run Code Online (Sandbox Code Playgroud)
将十六进制数转换为十进制数。这不是 bash 或 ksh 特有的。