bashで進数変換
今回は数値計算に使うbcコマンドを利用する.
この変換は2進数,8進数,16進数だけでなく進数に対応している.
進数変換は次のようにタイプする.
echo "obase=; ibase=; " | bc
・ibaseには入力する数値の進数
・obaseには出力する数値(変換後)の進数
↓こんなかんじ
$echo "obase=10; ibase=2; 111" | bc 7 $echo "obase=16; ibase=10; 254" | bc FE $echo "obase=2; ibase=10; 63" | bc 111111
これでは,とても手軽じゃないので以下のようにxnumという名前でスクリプト書いて,
パスの通った場所において使っている.
$cat /usr/local/bin/xnum #!/bin/bash if [ $# -ne 3 ]; then #引数の個数が3でなければ echo "自分がわかるエラー文を書く" 1>&2 exit 0 fi str=$(echo $3|tr "a-f" "A-F") #大文字でないと動かなかった echo "obase=$1; ibase=$2; $str" |bc
なお,16進数では頭に0xや\xを付けたいときがあるので以下のように sedを使えば2文字起きに\xを挿入できる.
$xnum 16 10 10000 | gsed 's/../\\\x\0/g' \x27\x10
- おまけ
echoの-eオプションでは「文字列中のエスケープ文字を有効にして表示します」とあり 印字可能文字以外の生データの記述ができる(キーボードからは入力できない文字?が入力できる). したがってリダイレクトなどを使えばバイナリ(ヘキサ)エディタでみるような生データの書き込みができる.
$echo -e '\x89\x50\x4E\x47' ?PNG