如何将扩展名为 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。
我正在尝试从我的 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。