【问题标题】:How to convert a sequence of bits (bitmask) into the corresponding hex number如何将位序列(位掩码)转换为相应的十六进制数
【发布时间】:2018-01-15 04:28:57
【问题描述】:

假设我有位掩码1000000000。我想将其转换为等效的十六进制数,即0x200(具体来说,我只想要200 部分,但这很容易处理)

我知道我可以用 Python 或使用各​​种 bash 特性和函数来做到这一点。例子:

python -c "print format(0b1000000000, 'x')"
200

printf '%x\n' "$((2#1000000000))"
200

echo 'ibase=2;obase=10000;1000000000'|bc
200

但是,我只想使用 sh 中可用的函数(即 Shell,而不是 Bash)来执行此操作。更具体地说,我希望它与sh 一起工作在我正在组合的initrd 图像中。 AFAIK,以上示例均不适用于 initramfs / busybox 上下文。

【问题讨论】:

  • 所以awk 解决方案对您不可用?我几乎可以肯定您将不得不调用外部工具来在sh 中进行此转换,特别是如果您正在谈论busybox sh。祝你好运。
  • 是的,我说的是busyboxsh。我可以试试awk。在这种情况下,转换会是什么样子?谢谢:-)

标签: linux shell binary hex initrd


【解决方案1】:

busybox sh 似乎有足够的功能(“子字符串”参数替换和算术评估)对此足够有用:

$ busybox sh


BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

~ $ bitstr=1000000000
~ $ n=0
~ $ i=0
~ $ while [ $i -lt ${#bitstr} ]; do
> n=$(( 2*n + ${bitstr:$i:1} ))
> i=$((i+1))
> done
~ $ echo $n
512
~ $ printf "%x\n" $n
200

封装成函数:

b2h() {
  local bitstr=$1 n=0 i=0
  while [ $i -lt ${#bitstr} ]; do
    n=$(( 2*n + ${bitstr:$i:1} ))
    i=$(( i + 1 ))
  done
  printf "%x\n" "$n"
}
b2h 1000000000   # => 200

【讨论】:

  • 原来这适用于我的开发机器的busybox,但不适用于我想要进行转换的嵌入式Linux设备的initramfs。具体来说,n=$(( 2*n + ${bitstr:$i:1} )) 的结果是 syntax error: bad substitution,这并不奇怪,因为根据 ShellCheck,“字符串索引不是 POSIX 标准”。
  • 设备上的busybox还在吗?什么版本?
  • BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) built-in shell (ash)
猜你喜欢
  • 2016-07-17
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多