如何在 bash 脚本中添加两个十六进制数字

如何在 bash 脚本中添加两个十六进制数字

我想在 bash 脚本中添加两个十六进制变量。我希望它们以十六进制开始并以十六进制结束,而不是十进制。

到目前为止我所想出的是一些关于黑客的东西。有更好或更优雅的解决方案吗?

BASE=0xA000

OFFSET=0x1000

NEW_BASE=$(( $BASE + $OFFSET ))

NEW_BASE=`printf "0x%X\n" $NEW_BASE`

echo $NEW_BASE

0xB000

答案1

我只是将你的脚本简化为:

printf "0x%X\n" $((0xA000 + 0x1000))

答案2

bash是的,inprintf是在不同基数中重新格式化数字的唯一内置方法,并且仅支持基数 8、10 和 16。

bash(与ksh93或 之类的 shell 相反fish)中,使用命令替换意味着分叉子 shell。您可以使用printf -v此处来避免使用子 shell(也可在zshforprintprintf( print -f) 的最新版本中使用,它也支持打印到数组中):

printf -v NEWBASE '%#X' "$((BASE + OFFSET))"

(在 中bash,与 相反zsh$((...))受到分词的影响,因此需要引用以避免对 的依赖$IFS)。

在 中zsh,您可以将扩展基数指定为算术扩展语法的一部分(基数 2 到 36):

$ echo $(([#16] 0xff + 0xff))
16#1FE
$ echo $(([##16] 0xff + 0xff))
1FE
$ echo 0x$(([##16] 0xff + 0xff))
0x1FE
$ echo $(([##2] 0xff + 0xff))
111111110

使用 ksh 和 zsh,您还可以使用以下命令强制将整数变量扩展为特定基数:

typeset -i 16 NEWBASE

扩展将采用以下16#1FE形式。 ksh93 支持最多 64 个碱基zshmksh最多 36 个碱基。

ksh93 的printf 内置函数支持输出任意基数的数字以及带或不带n#前缀的数字:

$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110

在 ksh93 中,var=$(printf...)不会分叉子 shell,因此与bashs一样高效printf -v

答案3

在 GNU 或现代 BSD 中dc你可以这样做:

echo A000 1000 | dc -e '16o16i?+p'

16o设置输出基数。 16i设置输入基础。从标准输入读取?一行,在本例中将两个数字压入堆栈。 +他们补充道。 p打印堆栈顶部(答案)。

答案4

和 的和$hexNumA$hexNumB

printf "%x\n" $((16#$hexNumA + 16#$hexNumB))

您甚至可以轻松地将十进制添加到十六进制:

printf "%x\n" $((16#$hexNum + $decNum))

礼貌: ”在 Bash 中将十六进制转换为十进制

相关内容