Как я могу прочитать шестнадцатеричные числа с расширением 0x0 как нормальные шестнадцатеричные числа или целые числа - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь прочитать значения в адресах i2 c из моего Raspberry Pi. Используя 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=$1
29 adj=$2
30 if [ $1 -gt 0 ]
31 then
32   addition
33 fi

То, что я пытаюсь сделать, это прочитать значение регистра по адресу, преобразовать его в десятичное число и затем добавить его с любым числом, которое я хотеть. Однако я заметил, что не могу использовать echo "obase=10; $reg_state | bc" из-за присутствия '0x'. При преобразовании шестнадцатеричных чисел без расширения все работает нормально, и их можно добавлять как обычно.

При этом, есть ли в любом случае, я могу избавиться от части '0x' и просто иметь то, что осталось, чтобы я мог делай арифметику c с миром?

1 Ответ

1 голос
/ 17 апреля 2020

Вам не нужно bc, чтобы делать целочисленную математику, даже для шестнадцатеричных чисел. Просто используйте shell arithmeti c расширение. Например, echo "$(( 0xA + 1))" будет отображать 11. И если вам нужен результат в шестнадцатеричном виде:

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

выведет 0xB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...