Shell脚本中的十六进制到十进制

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中或使用外部程序执行此操作:

:

$ echo $((16#FF))
255
Run Code Online (Sandbox Code Playgroud)

:

$ echo "ibase=16; FF" | bc
255
Run Code Online (Sandbox Code Playgroud)

:

$ perl -le 'print hex("FF");'
255
Run Code Online (Sandbox Code Playgroud)

:

$ printf "%d\n" 0xFF
255
Run Code Online (Sandbox Code Playgroud)

:

$ 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)

:

$ 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 -e 'println Integer.parseInt("FF",16)'
255
Run Code Online (Sandbox Code Playgroud)

  • 所以 ?在修改问题的意义之前,这正是我的4个命令的目的. (10认同)
  • 在bash中你也可以使用`$((0xff))`,即使用类似C的十六进制前缀而不是`16#`,尽管`N#`显然更为通用. (3认同)
  • 第一个bash示例容易出现整数溢出错误,例如`echo $((077E9F2DBF49D100001#FF))`溢出64位整数限制2 ^ 64.`bc`正确处理这个问题. (3认同)
  • `printf`解决方案是POSIX吗?如果是,那是最好的:) (2认同)

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)

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

  • 好的,但要注意整数溢出错误,例如 `echo $((0x077E9F2DBF49D100001))` 溢出了 2^64 的 64 位整数限制。`bc` 正确处理了这个问题 (2认同)

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 特有的。