じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

bashで進数変換

今回は数値計算に使うbcコマンドを利用する.
この変換は2進数,8進数,16進数だけでなく{n}進数{(2 \leq n \leq 16)}に対応している.

進数変換は次のようにタイプする.
echo "obase={y}; ibase={x}; {\ z}" | bc
・ibaseには入力する数値{(z)}の進数
・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