0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bashだけで10進数からn進数(2~64進数)に変換する

Last updated at Posted at 2020-10-09

はじめに

10進数からn進数(2~64進数)に変換するBashスクリプトの関数です。今回は引数チェックも入れました。Bash 4.4.12で動作を確認しています。

コード

conv_digit.sh
function conv_digit()
{
  local natural digit quotient surplus sign c64 result
  c64='0123456789abcdefghijklmnopqrstuvwxyz'\
'ABCDEFGHIJKLMNOPQRSTUVWXYZ@_'

  [[ -n ${1:-} ]] || return
  if [[ $1 =~ ^(\+?)([0-9]+)$ ]]
  then
    sign=${BASH_REMATCH[1]:-}
    natural=${BASH_REMATCH[2]};
    sign=${sign/+/}
  else
    echo "${FUNCNAME[0]}($1,$2): Arg 1 is invalid. call"\
      "from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
    return 1
  fi
  if [[ -n ${2:-} ]]
  then
    if [[ $2 -lt 2 || $2 -gt 64 ]]
    then
      echo "${FUNCNAME[0]}($1,$2): Arg 2 is invalid. call"\
      "from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
      return 1
    else
      digit=$2
    fi
  else
    digit=10
  fi
  echo -n ${sign:-}
  while :
  do
    surplus=$(($natural%$digit))
    natural=$(($natural/$digit))
    result=${c64:$surplus:1}${result:-}
    [[ $natural -eq 0 ]] && break
  done
  echo $result
}

使い方

.sh
$ . conv_digit.sh
$ conv_digit 17 2
10001
$ conv_digit 31 16
1f
$ conv_digit 31
31

n進数から10進数にするにはBashの組み込み機能で行なえます。

.sh
$ echo $((16#1f))
31
$ echo $((16#$(conv_digit 31 16)))
31

補足

第一引数は変換する10進自然数で、一般的な64ビット環境では0から2^63-1(=9223372036854775807)の範囲の整数となります。先頭に0がつく数字は8進数として認識されるようです。負値や小数は扱えません。指数表記はどうなるか不明です。
なお第二引数は進数を指定します。2から64の整数のみを指定でき、負の値や小数、指数表記はエラーになります。
負値も変換したい場合は、Bashだけで16進数・10進数・2進数間の相互変換を行う をご覧ください。

諸注意

コードはご自由に使って頂いて構いませんが、使用する事のより発生するあらゆる事象に対して一切の保証や補償は致しません。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?