如何将一系列位(位掩码)转换为相应的十六进制数
假设我有位掩码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
可使用此功能只(即壳牌,不击)。更具体地说,我希望它能与我合作的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 "%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}))'会导致'语法错误:错误替代',这并不令人感到意外,因为“字符串索引不是POSIX标准”到ShellCheck。 –
它在设备上仍然是busybox吗?什么版本? –
'BusyBox v1.21.1(Ubuntu 1:1.21.0-1ubuntu1)内置外壳(灰)'' –
这样一个'AWK '解决方案对你不适用?我几乎可以肯定,你将不得不调用一个外部工具来在'sh'中执行这种转换。特别是如果你正在讨论'busybox''sh'。祝你好运。 – shellter
是的,我在说'busybox''sh'。我可以试一试'awk'。在这种情况下,转换将如何?感谢:-) –