16进制数Shell脚本十进制(Hexadecimal To Decimal in Shell Sc

2019-06-19 00:57发布

有人可以帮我一个十六进制数转换为十进制数在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 "-")

Answer 1:

从十六进制到十进制转换,有很多方法可以做到这在外壳或外部程序:

随着庆典 :

$ 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


Answer 2:

在Linux上的busybox的一个非常轻量级的嵌入式版本处理意味着许多传统的命令不可用(BC,printf的,DC,PERL,Python)的

echo $((0x2f))
47

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

感谢彼得·梁对这个解决方案。



Answer 3:

使用shell(bash或ksh的,不与前围工作)做另一种方式:

echo $((16#FF))
255


Answer 4:

各种工具提供给您在外壳中。 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脚本。



Answer 5:

当变量是空(或空)作为报告的错误显示为:

$ 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位整数。 这将是与卑诗省唯一的差别不具有这样的限制。



Answer 6:

在仪表板和其他炮弹,你可以使用

printf "%d\n" (your hexadecimal number)

为十六进制数转换为十进制。 这不是bash中,或ksh,具体。



文章来源: Hexadecimal To Decimal in Shell Script