如何将扩展名为 0x0 的十六进制数读取为普通十六进制数或整数

How can I read Hexidecimal numbers with the 0x0 extension as either normal Hex numbers or integers

我正在尝试从我的 raspberry pi 中读取 i2c 地址中的值。通过使用 i2ctools,我可以获取一个地址并将其存储在一个变量中。

reg_state=$(i2cget -y 1 0x20 0x09)
echo "$reg_state"
:~/ $ 0x0a

但是,虽然地址读入正确,reg_state会保留“0x0”的十六进制扩展名,这会妨碍操作。假设 0x0a 之前在寄存器中,我想在该值上加“1”,操作将无法完成。我认为这与我努力实现目标的方式有关。现在我的代码如下所示:

7 addition(){
8   reg_state=$(i2cget -y 1 0x20 0x09)
9   i=$(echo "obase=10; $reg_state"| bc)
10  write=$(i+adj )
}
...
25
26#Main Shell Script
27
28 op=
29 adj=
30 if [  -gt 0 ]
31 then
32   addition
33 fi

我想做的是读入地址寄存器的值,将其转换为十进制数,然后将其与我想要的任何数字相加。但是,我注意到由于存在“0x”,我无法使用 echo "obase=10; $reg_state | bc"。在没有扩展名的情况下转换十六进制数字时一切正常,并且可以像往常一样添加它们。

话虽如此,我是否可以去掉“0x”部分,只剩下剩下的部分,这样我就可以安心地做我的算术了?

您不需要 bc 来进行整数运算,即使是十六进制数。只需使用 shell 算术展开。例如,echo "$(( 0xA + 1))" 将显示 11。如果您需要十六进制的结果:

printf "0x%X" $(( 0xA + 1))

将打印 0xB。