1. ホーム
  2. python

[解決済み] 62進数変換

2022-11-16 23:19:01

質問

整数をどのように62進数(16進数のように、しかしこれらの数字で: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')に変換するのでしょうか。

私はそのための良いPythonライブラリを見つけようとしましたが、それらはすべて文字列を変換することで占められているようです。Python base64 モジュールは文字列しか受け付けず、1 つの桁を 4 文字に変換します。私は、URL短縮ツールが使用するものに類似したものを探していました。

どのように解決するのですか?

標準のモジュールはありませんが、自作の関数で実現しました。

BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def encode(num, alphabet):
    """Encode a positive number into Base X and return the string.

    Arguments:
    - `num`: The number to encode
    - `alphabet`: The alphabet to use for encoding
    """
    if num == 0:
        return alphabet[0]
    arr = []
    arr_append = arr.append  # Extract bound-method for faster access.
    _divmod = divmod  # Access to locals is faster.
    base = len(alphabet)
    while num:
        num, rem = _divmod(num, base)
        arr_append(alphabet[rem])
    arr.reverse()
    return ''.join(arr)

def decode(string, alphabet=BASE62):
    """Decode a Base X encoded string into the number

    Arguments:
    - `string`: The encoded string
    - `alphabet`: The alphabet to use for decoding
    """
    base = len(alphabet)
    strlen = len(string)
    num = 0

    idx = 0
    for char in string:
        power = (strlen - (idx + 1))
        num += alphabet.index(char) * (base ** power)
        idx += 1

    return num

エンコードとデコードに使用するアルファベットを任意に指定できることに注意してください。もし alphabet 引数を省略した場合、最初の行で定義された 62 文字のアルファベットを取得することになり、したがって 62 ベースのエンコード/デコードを行うことになります。

これが役立つことを願っています。

PS - URL 短縮プログラムでは、0Ol1oI などの紛らわしい文字は使わない方が良いことがわかりました。したがって、私は URL 短縮の必要性からこのアルファベットを使用しています。 "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"

楽しんでください。