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

问题描述:

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

+0

这样一个'AWK '解决方案对你不适用?我几乎可以肯定,你将不得不调用一个外部工具来在'sh'中执行这种转换。特别是如果你正在讨论'busybox''sh'。祝你好运。 – shellter

+0

是的,我在说'busybox''sh'。我可以试一试'awk'。在这种情况下,转换将如何?感谢:-) –

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

原来,这可以在我的开发机器的busybox上运行,但不是在我想要进行转换的嵌入式Linux设备的'initramfs'中。具体来说,'n = $((2 * n + $ {bitstr:$ i:1}))'会导致'语法错误:错误替代',这并不令人感到意外,因为“字符串索引不是POSIX标准”到ShellCheck。 –

+0

它在设备上仍然是busybox吗?什么版本? –

+0

'BusyBox v1.21.1(Ubuntu 1:1.21.0-1ubuntu1)内置外壳(灰)'' –