BASH基本変換を10進数から16進数に変換

BASH基本変換を10進数から16進数に変換

Bashで進数を10進数に変換する方法到着もう1つの基本、特に16進数です。別の方向に行くのは簡単なようです。

$ echo $((16#55))
85

Webを検索しながら数学と文字操作を実行して関数として使用できる変換を実行するスクリプトを見つけましたが、bashには既に基数変換が組み込まれているようです。これは可能ですか?

答え1

bash(またはそのprintfコマンドが利用可能な場合は、任意のシェル(通常はシェルに組み込まれている標準のPOSIXコマンド))を使用してください。

printf '%x\n' 85

を使用すると、zsh次の操作も実行できます。

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

これは2から36までのデフォルトの数字に適用されます(0-9a-z数字は大文字と小文字を区別しません)。

$(([#16]dev))オプションが有効になると(1つだけ)または(デフォルト16の特別な場合として)に#展開されます(デフォルト8にも適用されます(オプションも有効な場合は代わりに))。16#550x55cbases01258#125octalzeroes

Pass 以下を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

dcまたは(bc一部のシステムではまだラッパーである)と同じですdc

$ echo 30o123456p | dc
 04 17 05 06

答え2

printfを使用してください:

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

変数に値を代入するには、コマンド置換を使用します。

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

答え3

すべてのPOSIX互換シェルにある組み込み算術拡張機能を使用して置き換えます。これは最近ほとんど普遍的です。

$ echo $((0xbc))
188

そして

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

注:特に最後の例で拡張すると、予期しない結果が生じる可能性があります。変数 "hex" の 16 進数は、正当な 16 進定数を形成する必要があります。そうしないと、あいまいなエラー メッセージが発生する可能性があります。たとえば、「hex」が「0xdead」の場合、算術拡張は0x0xdeadになり、これは定数として解釈できません。もちろん、この場合、算術拡張 $(($hex)) はトリックを実行します。読者は、オプションの「0x」プレフィックスを削除するための単純な部分文字列処理パターンマッチングを作成する練習のままにします。

答え4

awkを使用できます。ベルベット図書館:

$ velour -n 'print n_baseconv(15, 10, 16)'
F

または:

$ velour -n 'print n_baseconv(ARGV[1], 10, 16)' 15
F

関連情報