我有一个通过SNMP收集十六进制值的例程。这是我的bash脚本08 01 18 00 FF FF中的真实集合。该值基于expr $((16#$ {array [4]})) - $((16#$ {array [5]}))所以结果是0,我如何介绍两个是补码? expr $((16#$ {array [4]})) - $((16#$ {array [5]}))的正确值是-1,基于我正在处理的示例。
答案 0 :(得分:2)
为方便起见,让我们创建一个bash函数:
twos() { x=$((16#$1)); [ "$x" -gt 127 ] && ((x=x-256)); echo "$x"; }
现在:
$ twos FF
-1
$ twos FE
-2
$ twos 01
1
定义扩展二进制补码函数:
$ twosx() { for x in "$@"; do x=$((16#$x)); [ "$x" -gt 127 ] && ((x=x-256)); printf "%s " "$x"; done; echo ""; }
样本用法:
$ twosx 00 01 7F 80 FE FF
0 1 127 -128 -2 -1