'mawk'を使用して16進数を範囲外の10進数に変換する

'mawk'を使用して16進数を範囲外の10進数に変換する

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

おすすめ記事