如何将位序列(位掩码)转换为相应的十六进制数

时间:2017-08-07 19:12:06

标签: linux shell binary hex initrd

我们说我有位掩码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上下文。

1 个答案:

答案 0 :(得分:3)

似乎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