BASH 十六进制值的二进制补码示例?
Example for BASH two's complement with Hex values?
我有一个通过 SNMP 收集十六进制值的例程。这是我的 bash 脚本 08 01 18 00 FF FF 中的一个真实集合。该值基于 expr $((16#${array[4]})) - $((16#${array[5]})) 所以结果为 0,我如何引入两个补码?根据我正在处理的示例,expr $((16#${array[4]})) - $((16#${array[5]})) 的正确值为 -1。
为方便起见,我们创建一个bash函数:
twos() { x=$((16#)); [ "$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
我有一个通过 SNMP 收集十六进制值的例程。这是我的 bash 脚本 08 01 18 00 FF FF 中的一个真实集合。该值基于 expr $((16#${array[4]})) - $((16#${array[5]})) 所以结果为 0,我如何引入两个补码?根据我正在处理的示例,expr $((16#${array[4]})) - $((16#${array[5]})) 的正确值为 -1。
为方便起见,我们创建一个bash函数:
twos() { x=$((16#)); [ "$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