16進数が比較的小さい場合は、次のものを使用できます。
echo 0xFF| mawk '{ printf "%d\n", $1}'
16進数を10進数に変換します。
16進数が非常に大きい場合、それはmawk
機能しなくなります。
echo 0x8110D248 | mawk '{ printf "%d\n", $1 }'
出力2147483647
(間違ったものと2147483647
同じ0x7FFFFFFF
)。
より大きな数字を変換するには?
処理する数字が多すぎます(1行に1つの数字、10M以上)。たとえば、0xFF\n 0x1A\n 0x25\n
この場合どうすれば処理できますか?合格xargs
?もっと良い方法がありますか?xargs
本当に遅いです。
ベストアンサー1
ランダムに大きい数字のより良いコマンドはですbc
。変換を行う機能です。
hextodec() {
local hex="${1#0x}"
printf "ibase=16; %s\n" "${hex^^}" | bc
}
hextodec 0x8110D248
2165363272
ここでは、変数を使用するときに変数値を操作する奇妙な機能を使用しています。
"${1#0x}"
-"$1"
予想通り、これは関数の最初のパラメータを参照します。#
修飾子です(man bash
例:参照または読み取りPOSIX) 値の先頭から次の式を削除します。たとえば、0xab12
これは次のように返されます。ab12
"${hex^^}"
-"$hex"
アルファベット文字が大文字にマップされた値を参照しますが返します。 (これはbash
拡張なので読み取らman bash
れますが、POSIXは読みません。)たとえば、次のよう12ab34
に返されます。12AB34
どちらの場合も、中{ … }
括弧は修飾子を変数にバインドします。変数の値のみが返され、その後に2つの上向き矢印/カラット文字が続きます"$hex^^"
。$hex