151

誰かがシェルスクリプトで16進数を10進数に変換するのを手伝ってもらえますか?

bfca3000たとえば、シェルスクリプトを使用して16進数を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 "-")
4

8 に答える 8

372

16進数から10進数に変換するには、シェル内または外部プログラムを使用して変換する方法が多数あります。

bash

$ echo $((16#FF))
255

付き:

$ echo "ibase=16; FF" | bc
255

付き:

$ perl -le 'print hex("FF");'
255

付き:

$ printf "%d\n" 0xFF
255

で:

$ python -c 'print(int("FF", 16))'
255

付き:

$ ruby -e 'p "FF".to_i(16)'
255

で:

$ nodejs <<< "console.log(parseInt('FF', 16))"
255

と:

$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255

で:

$ groovy -e 'println Integer.parseInt("FF",16)'
255
于 2012-11-07T23:36:18.013 に答える
48

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

echo $((0x2f))
47

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

このソリューションについては、PeterLeungの功績によるものです。

于 2014-04-04T12:48:47.103 に答える
14

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

echo $((16#FF))
255
于 2013-05-14T07:26:49.117 に答える
13

シェル内からさまざまなツールを利用できます。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 ~]$ 

コマンドは「dcdeskcalc」です。また、のようbcにstdinから入力を受け取りますが、「演算の優先順位」を使用する代わりに、スタッキング(「逆ポーランド記法」)表記を使用します。スタックに追加する入力を指定してから、アイテムをスタックからポップする演算子を指定して、結果をプッシュバックします。

上記のコマンドには、次のものがあります。

  • 16i--基数16(16進数)の入力を受け入れるようにdcに指示します。出力ベースを変更しません。
  • BFCA3000-あなたの最初の番号
  • 17FF-最初の数から引くために選んだランダムな16進数
  • --プッシュした2つの数値を取得し、前の数値から後の数値を減算して、結果をスタックにプッシュします。
  • p-スタックの最後のアイテムを印刷します。これはスタックを変更しないので...
  • 10o--出力を基数「10」で出力するようにdcに指示しますが、入力の番号付けスキームは現在16進数であるため、「10」は「16」を意味することに注意してください。
  • p-スタックの最後のアイテムをもう一度印刷します...今回は16進数で。

DCを使用して、非常に複雑な数学ソリューションを構築できます。シェルスクリプト用のツールボックスに入れるのは良いことです。

于 2012-11-08T00:21:01.643 に答える
7

ダッシュやその他のシェルでは、

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

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

于 2015-11-12T21:36:35.113 に答える
4

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

$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")

これは、bcに指定された値が正しくなかったために発生する可能性があります。それは、bcが大文字の値を必要としているということかもしれません。必要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ビットの数学で表すことができると想定しています。64ビットでコンパイルされた場合、Bashは((2 ** 63)-1)未満の整数に制限されます。それはそのような制限がないbcとの唯一の違いになります。

于 2015-08-29T22:34:54.247 に答える
4

まだ最短の方法:

$ echo $[0x3F]
63
于 2020-10-27T17:37:08.960 に答える
2

$ PATHにこの便利なスクリプトがあり、フィルターのようになり0x1337ます。1337; または"0x1337"10進文字列への入力行(わかりやすくするために展開):

#!/usr/bin/env bash

while read data; do
  withoutQuotes=`echo ${data} | sed s/\"//g`
  without0x=`echo ${withoutQuotes} | sed s/0x//g`
  clean=${without0x}
  echo $((16#${clean}))
done
于 2020-11-16T16:27:05.623 に答える