誰かがシェルスクリプトで16進数を10進数に変換するのを手伝ってくれますか?
たとえば、シェルスクリプトを使用して、16進数bfca3000
を10進数に変換したいです。基本的に、2つの16進数の差が必要です。
私のコードは:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
実行すると、次のエラーが表示されます。
Line 48: -: syntax error: operand expected (error token is "-")
16進数から10進数に変換するには、シェルまたは外部プログラムで行う方法が多数あります。
bash の場合:
$ echo $((16#FF))
255
bc の場合:
$ echo "ibase=16; FF" | bc
255
Perl の場合:
$ Perl -le 'print hex("FF");'
255
printf で:
$ printf "%d\n" 0xFF
255
python の場合:
$ python -c 'print(int("FF", 16))'
255
Ruby の場合:
$ Ruby<<EOF
p "FF".to_i(16).to_s(10)
EOF
"255"
node.js の場合:
$ nodejs <<< "console.log(parseInt('FF', 16))"
255
rhino の場合:
$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255
groovy の場合:
$ groovy -e 'println Integer.parseInt("FF",16)'
255
Linuxでbusyboxの非常に軽量な組み込みバージョンを扱うことは、従来のコマンドの多くが利用できないことを意味します(bc、printf、dc、Perl、python)
echo $((0x2f))
47
hexNum=2f
echo $((0x${hexNum}))
47
Peter Leung このソリューションの功績。
シェルを使用してそれを行うもう1つの方法(bashまたはksh、ダッシュでは機能しません):
echo $((16#FF))
255
シェル内からさまざまなツールを使用できます。 Sputnickは、最初の質問に基づいて、オプションの優れた概要を提供しました。彼は間違いなくあなたに複数の正解を与えるために費やした時間の票に値します。
もう1つ、彼のリストにはありません。
[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816
しかし、あなたがしたいのが減算だけなら、なぜ入力を10を底に変更するのが面倒ですか?
[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$
dc
コマンドは「desk calc」です。また、bc
のようにstdinから入力を受け取りますが、「操作の順序」を使用する代わりに、スタック(「逆ポーランド語」)表記を使用します。スタックに追加する入力を指定し、スタックからアイテムをポップする演算子を指定して、結果をプッシュバックします。
上記のコマンドには、次のものがあります。
16i
-16進数(16進数)で入力を受け入れるようにdcに指示します。出力ベースを変更しません。BFCA3000
-初期番号17FF
-最初の数字から差し引くために選んだランダムな16進数-
-プッシュした2つの数値を取得し、前の数値から後の数値を減算して、結果をスタックにプッシュしますp
-スタックの最後のアイテムを出力します。これはスタックを変更しないため、...10o
-出力をベース「10」で出力するようにdcに指示しますが、入力番号付けスキームは現在16進数であるため、「10」は「16」を意味します。p
-スタックの最後のアイテムをもう一度印刷します...今回は16進数で。Dcを使用すると、非常に複雑な数学ソリューションを構築できます。シェルスクリプトのツールボックスに入れるのは良いことです。
報告されたエラーは、変数がヌル(または空)の場合に表示されます。
$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")
これは、bcに指定された値が正しくないために発生する可能性があります。 bcにはUPPERcase値が必要なのかもしれません。 BFCA3000
ではなく、bfca3000
が必要です。これはbashで簡単に修正でき、^^
展開を使用するだけです:
var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`
これにより、スクリプトが次のように変更されます。
#!/bin/bash
var1="bfca3000"
var2="efca3250"
var3="$(echo "ibase=16; ${var1^^}" | bc)"
var4="$(echo "ibase=16; ${var2^^}" | bc)"
var5="$(($var4-$var3))"
echo "Diference $var5"
ただし、bashは変換と減算を直接実行できるため、bc [1]を使用する必要はありません。
#!/bin/bash
var1="bfca3000"
var2="efca3250"
var5="$(( 16#$var2 - 16#$var1 ))"
echo "Diference $var5"
[1]注:値は元のスクリプトのbashで計算されたため、値は64ビットの数学で表すことができると想定しています。 Bashは、64ビットでコンパイルされている場合、((2 ** 63)-1)未満の整数に制限されます。それは、そのような制限がないbcとの唯一の違いです。
ダッシュや他のシェルでは、次を使用できます
printf "%d\n" (your hexadecimal number)
16進数を10進数に変換します。これは、bashまたはksh固有ではありません。