1

bitmask があるとしましょう1000000000。それを同等の16進数に変換したい、つまり0x200(具体的には、その200部分だけが欲しいのですが、それは簡単に処理できます)

bashPython で、またはさまざまな機能や関数を使用してこれを実行できることを知っています。例:

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

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

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

しかし、私はこれをsh、BashではなくShellで利用可能な機能のみを使用して行いたいと考えています。より具体的には、私がまとめてshいるイメージで動作するようにしたい. initrd私の知る限り、上記の例はどれもinitramfs/busyboxコンテキストでは機能しません。

4

1 に答える 1

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
于 2017-08-07T22:36:50.817 に答える