Как преобразовать из base-36 в base-62 в обычный JS без библиотек или модулей - PullRequest
0 голосов
/ 17 апреля 2020

Я ищу сценарий JS, который преобразует число base-36, например:

23SQJ1LNEFSL00H18IVWABMP

, в число base-62, например:

1rZmfPo0xtnf8CLTfWRJh

I я пытаюсь перевести этот python код, чтобы сделать это.

converter.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)

Как я могу выполнить sh это?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Преобразует базу-10 в базу-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;    
    }
  } 
})();
0 голосов
/ 17 апреля 2020

Вот ответ, который я нашел от @RyanSmith { ссылка }

function convertBase(value, from_base, to_base) {
  var range = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/'.split('');
  var from_range = range.slice(0, from_base);
  var to_range = range.slice(0, to_base);

  var dec_value = value.split('').reverse().reduce(function (carry, digit, index) {
    if (from_range.indexOf(digit) === -1) throw new Error('Invalid digit `'+digit+'` for base '+from_base+'.');
    return carry += from_range.indexOf(digit) * (Math.pow(from_base, index));
  }, 0);

  var new_value = '';
  while (dec_value > 0) {
    new_value = to_range[dec_value % to_base] + new_value;
    dec_value = (dec_value - (dec_value % to_base)) / to_base;
  }
  return new_value || '0';
}
...