web-dev-qa-db-ja.com

シェルスクリプトでの16進数から10進数へ

誰かがシェルスクリプトで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 "-")
112
VenkateshJN

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
267
Gilles Quenot

Linuxでbusyboxの非常に軽量な組み込みバージョンを扱うことは、従来のコマンドの多くが利用できないことを意味します(bc、printf、dc、Perl、python)

echo $((0x2f))
47

hexNum=2f
echo $((0x${hexNum}))
47

Peter Leung このソリューションの功績。

35
hinekyle

シェルを使用してそれを行うもう1つの方法(bashまたはksh、ダッシュでは機能しません):

echo $((16#FF))
255
13
Tomás Fox

シェル内からさまざまなツールを使用できます。 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を使用すると、非常に複雑な数学ソリューションを構築できます。シェルスクリプトのツールボックスに入れるのは良いことです。

11
ghoti

報告されたエラーは、変数がヌル(または空)の場合に表示されます。

$ 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との唯一の違いです。

3
user2350426

ダッシュや他のシェルでは、次を使用できます

printf "%d\n" (your hexadecimal number)

16進数を10進数に変換します。これは、bashまたはksh固有ではありません。

2
novice