【问题标题】:Example for BASH two's complement with Hex values?带有十六进制值的 BASH 二进制补码示例?
【发布时间】:2015-10-26 05:24:49
【问题描述】:

我有一个通过 SNMP 收集十六进制值的例程。这是我的 bash 脚本 08 01 18 00 FF FF 的真实集合。该值基于 expr $((16#${array[4]})) - $((16#${array[5]})) 所以结果为 0,我如何引入两个是补码?根据我正在处理的示例, expr $((16#${array[4]})) - $((16#${array[5]})) 的正确值为 -1。

【问题讨论】:

  • 你能解释一下为什么 FF - FF 应该是 -1 吗?
  • FF - FF 应该是 0。
  • 二进制补码中 255 的无符号值为 -1,如何在 bash 中使用二进制补码,如果我有 255,如何转换为 -1

标签: bash hex decimal twos-complement


【解决方案1】:

为方便起见,让我们创建一个 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 

【讨论】:

  • 是否可以将 echo 用于 twosx(),这样我就可以将输出与脚本中的另一个字符串结合起来,例如 echo 'device 1=' twos & twosx 00 01 7F 80 FE FF
  • 怎么样:echo "device 1=$(twosx 00 01 7F 80 FE FF)"?
猜你喜欢
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2014-11-03
  • 2014-03-01
相关资源
最近更新 更多