10進数から16進数へのBASHベースの変換


29

Bashでは、10進数から別のベース、特に16 進数へのベース変換をどのように行いますか。他の方法で行くのは簡単そうです:

$ echo $((16#55))
85

ウェブ検索で、変換を行うための数学と文字操作を行うスクリプトを見つけ、それを関数として使用できましたが、bashには既にベース変換が組み込まれていると思っていました-しますか?


回答:


35

bash(あるいは提供される任意のシェル、printfコマンドが利用可能である(多くの場合、シェルに組み込まれた標準のPOSIXコマンド)):

printf '%x\n' 85

を使用するとzsh、次のこともできます:

dec=85
hex=$(([##16]dec))

これは、0-9a-z2〜36の基数で機能します(数字として大文字と小文字を区別しません)。

ではksh93、次を使用できます。

dec=85
base54=$(printf %..54 "$dec")

これは、2〜64の基数(0-9a-zA-Z@_数字として)で機能します。

あります。kshzsh

$ typeset -i34 x=123; echo "$x"
34#3l

ただし、ksh88、zshおよびpdkshでは最大36個、ksh93では最大64個に制限されています。

これらはすべてlong、システム上の整数のサイズに制限されていることに注意してください(int一部のシェルでは)。より大きなものには、bcまたはを使用できますdc

$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF

2からPOSIXで少なくとも99までの数値が必要なサポートされている基数。16を超える基数の場合、9より大きい数字は、スペースで区切られた0で埋められた10進数として表されます。

$ echo 'obase=30; 123456' | bc
 04 17 05 06

またはdcbc以前は(一部のシステムではまだ)ラッパーであったdc)と同じ:

$ echo 30o123456p | dc
 04 17 05 06

ありがとう。まさに私が探していたもの。(そして、まごついてシンプル。)
デイヴ・ローブ

で指定できるような任意のベースを実行したい場合はどうします#か?
flarn2006

@ flarn2006。ではbash組み込みコマンド、次のことができ、入力他の塩基については8、10と16以外の任意の塩基のいずれかのベースでの数値ではなく、出力は、次のような別のシェル必要があると思いますzshか、kshまたは使用しますbc/dc
ステファンシャゼラス16

1
@StéphaneChazelas本当に?それはちょっと変です。彼らはそれが何かの構文でプログラムするには遅すぎるように思えます。入力を実装した場合、どのベースでも出力するという考えが頭をよぎらない方法はありません。
flarn2006

alias hex="printf '%x\n'"
mwfearnley

5

printfを使用します。

$ printf "%d %x\n" $((16#55)) $((10#85))
85 55

値を変数に割り当てるには、コマンド置換を使用します。

$ x=$( printf "%x" 85 ) ; echo $x
55

4
または、使用-v組み込みのprintfのオプションを:printf -v foo "%d" $((16#BEEF)); echo $foo
グレンはジャックマン

@Glenn非標準オプション(など-v)の使用はここでは不要です。避けたいです。
ジャニス

3
-vフォークとパイプを回避します(ビルトインのようにここでフォークしないksh93ではなく、bashでprintf)。$((16#55))どちらも標準ではないことに注意してください。
ステファンシャゼル

@StéphaneChazelas、ちょっと待って。ksh93はforkしないと言っていx=$(some_builtin)ますか?
グレンジャックマン

1
@glennjackman、はい、外部コマンドを実行するためだけに分岐します。
ステファンシャゼル

2

すべてのPOSIX準拠のシェルに組み込まれている組み込みの算術展開の置換を使用します。これは、最近ではほとんど普遍的です。

$ echo $((0xbc))
188

そして

$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005

注意:特に最後の例では、展開によって予期しない結果が生じる可能性があります。変数 'hex'の16進数字は、有効な16進定数を形成する必要があります。たとえば、「hex」が「0xdead」の場合、算術展開は0x0xdeadになりますが、これは定数として解釈できません。もちろん、その場合、算術展開$(($ hex))がトリックを行います。オプションの「0x」プレフィックスを削除する単純なサブストリング処理パターンマッチングを作成することは、読者の課題として残されています。


4
OPが彼の例で行ったのとまったく同じことをしている。彼は逆の操作を探しています。
トーマスギヨ-シオンネスト

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.