I have a routine that is collecting a hex value via SNMP. Here is a real collection from my bash script 08 01 18 00 FF FF. The value is base on expr $((16#${array[4]})) - $((16#${array[5]})) so the results are 0, how do I introduce two is complement? The correct value for expr $((16#${array[4]})) - $((16#${array[5]})) is -1 based on the example I am working on.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
For convenience, let's create a bash function:
twos() { x=$((16#$1)); [ "$x" -gt 127 ] && ((x=x-256)); echo "$x"; }
Now:
$ twos FF
-1
$ twos FE
-2
$ twos 01
1
Converting multiple values in one call
Define an eXtended two's complement function:
$ twosx() { for x in "$@"; do x=$((16#$x)); [ "$x" -gt 127 ] && ((x=x-256)); printf "%s " "$x"; done; echo ""; }
Sample usage:
$ twosx 00 01 7F 80 FE FF
0 1 127 -128 -2 -1