2

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.

justZito
  • 569
  • 1
  • 10
  • 19

1 Answers1

2

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 
John1024
  • 109,961
  • 14
  • 137
  • 171
  • is it possible to use echo for twosx() so I can combine the output with another string in the script like echo 'device 1=' twos & twosx 00 01 7F 80 FE FF – justZito Sep 03 '15 at 18:29
  • How about: `echo "device 1=$(twosx 00 01 7F 80 FE FF)"` ? – John1024 Sep 09 '15 at 18:21