首页 > 解决方案 > 如何在没有库或模块的普通 JS 中从 base-36 转换为 base-62

问题描述

我正在寻找一个可以转换 base-36 数字的 JS 脚本,例如:

23SQJ1LNEFSL00H18IVWABMP

到一个 base-62 数字,如:

1rZmfPo0xtnf8CLTfWRJh

我正在尝试翻译这个 python 代码来做到这一点。

转换器.py
BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def encode(num, alphabet=BASE62):
    """Encode a positive number in Base X

    Arguments:
    - `num`: The number to encode
    - `alphabet`: The alphabet to use for encoding
    """
    if num == 0:
        return alphabet[0]
    arr = []
    base = len(alphabet)
    while num:
        num, rem = divmod(num, base)
        arr.append(alphabet[rem])
    arr.reverse()
    return ''.join(arr)

我怎样才能做到这一点?

标签: javascriptpythonbasebase-conversionradix

解决方案


这会将 base-10 转换为 base-62 https://helloacm.com/base62/

// https://helloacm.com
// https://rot47.net
// base62.js
// provides conversion between base10 and base62

var Base62 = (function(){                
  var table = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

  function _to10(num)
  {
    var limit = num.length;
    var res = 0;
    for (var i = 0; i < limit; i ++)
    {
      res = 62 * res + table.indexOf(num.charAt(i));
    }
    return res;  
  }

  function _toBase(num)
  {
    var r = num % 62;
    var res = table.charAt(r);
    var q = Math.floor(num / 62);
    while (q)
    {
      r = q % 62;
      q = Math.floor(q / 62);
      res = table.charAt(r) + res;
    }
    return res;
  }

  return {
    FromBase10: function()
    {
      var r = [];
      for (var i = 0; i < arguments.length; i ++)
      {
        var num = parseInt(arguments[i]);
        r.push(_toBase(num));
      }
      return r;
    },

    FromBase62: function()
    {
      var r = [];
      for (var i = 0; i < arguments.length; i ++)
      {
        var num = arguments[i].toString();
        if (num.length)
        {
          r.push(_to10(num));
        }
      }
      return r;    
    }
  } 
})();

推荐阅读