cms.fundamental.base のソースコード

"""
概要: 指定された基数を持つ数値を別の基数に変換するスクリプト。

詳細説明:
このスクリプトは、コマンドライン引数として以下の3つの値を必要とします。
1. val: 変換対象の文字列形式の数値。
2. base_source: 変換元の基数(整数)。
3. base_target: 変換先の基数(整数)。

スクリプトはまず、`val` を `base_source` から基数10に変換します。
次に、基数10に変換された数値を `base_target` に変換して出力します。
対応する文字は '0'-'9', 'A'-'Z' で、最大基数36まで対応しています。

関連リンク: :doc:`base_usage`
"""
import sys


base_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
max_base = len(base_chars)


[ドキュメント] def value_base(char, b): """ 概要: 指定された文字の基数10における値を返す。 詳細説明: `base_chars` 文字列を使用して、与えられた文字(大文字・小文字を区別せず)が どの数値に対応するかを特定し、その基数10での値を返します。 例えば、'A' は 10 に、'F' は 15 に対応します。 :param char: 基数変換する単一の文字(例: 'A', '5')。 :type char: str :param b: 変換元の基数。この関数内では直接使用されませんが、インタフェースとして存在します。 :type b: int :returns: 文字が表す基数10の値。 :rtype: int """ return list(base_chars).index(char.upper())
if __name__ == "__main__": argv = sys.argv narg = len(argv) if narg <= 3: print("") print("Usage: python {} val base_source base_target".format(argv[0])) print("") exit() else: val = argv[1] base_source = int(argv[2]) base_target = int(argv[3]) if base_source > max_base: print("") print("Error: base_source [{}] is too large.".format(base_source)) print("") exit() if base_target > max_base: print("") print("Error: base_target [{}] is too large.".format(base_target)) print("") exit() print("") print(f"Convert {val} in base {base_source} to base 10") nstr = len(val) v10 = 0 for i in range(nstr): idx = nstr - 1 - i v = value_base(val[idx], base_source) if v >= base_source: print(f"Error: The value at the {i}-th digit {v} is not compatible with base {base_source}") exit() dv = v * base_source**i v10 += dv print(f"{i}-th digit = {v}_{base_source}: + {v}*{base_source}^{i} => + {dv:10}_10 => {v10:10}_10") b10 = str(v10) print("") print(f"Convert {b10} in base 10 to base {base_target}") vnext = v10 starget = '' while 1: n = int(vnext / base_target) residue = vnext % base_target starget = base_chars[residue] + starget print("{:10} = {:10} * {:10} + {:2}:".format(vnext, n, base_target, residue), end = '') print(" base_{} => {}".format(base_target, starget)) if n == 0: break vnext = n print("")