假设我有位掩码1000000000
。我想将其转换为等效的十六进制数,即0x200
(具体来说,我只想要200
部分,但这很容易处理(
我知道我可以在Python中或使用各种bash
特性和功能来做到这一点。例子:
python -c "print format(0b1000000000, 'x')"
200
printf '%xn' "$((2#1000000000))"
200
echo 'ibase=2;obase=10000;1000000000'|bc
200
但是,我想只使用sh
中可用的函数(即 Shell,而不是 Bash(来做到这一点。更具体地说,我希望它与我正在组合的initrd
图像中的sh
一起使用。AFAIK,上面的示例都不适用于initramfs
/busybox
上下文。
似乎 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 "%xn" $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 "%xn" "$n"
}
b2h 1000000000 # => 200