Base36 Кодировать строку? - PullRequest
3 голосов
/ 18 мая 2011

Я искал онлайн, но не могу найти решение этой проблемы. В Python, Ruby или Java, как на базе 36 можно кодировать следующую строку: nOrG9Eh0uyeilM8Nnu5pTywj3935kW + 5 =

Ответы [ 4 ]

8 голосов
/ 18 мая 2011

рубин


На базу 36:

s.unpack('H*')[0].to_i(16).to_s 36

от базы 36:

[s36.to_i(36).to_s(16)].pack 'H*'
1 голос
/ 20 апреля 2012

Я только что сделал это:

  static String encodeRootId(final String value) {
    try {
      final BigInteger bigInteger = new BigInteger(value.getBytes("UTF-8"));
      final String encoded = bigInteger.toString(Character.MAX_RADIX);

      //must encode the sign as well
      if (bigInteger.signum() < 0) {
        return 'n' + encoded.substring(1);
      } else {
        return 'p' + encoded;
      }
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException("impossible");
    }
  }

трюк для преобразования байтов строки [] в большое int привел к недостатку необходимости вручную кодировать возможное - по общему признанию, не красивое, но быстрое решение.

Кроме того, в моем случае использования мне не нужно декодировать, и производительность не имеет значения.

1 голос
/ 18 мая 2011

Похоже, в википедии есть статья о том, как это сделать на python: http://en.wikipedia.org/wiki/Base_36

0 голосов
/ 18 мая 2011

Это можно рассматривать как дубликат как еще один вопрос ... Кодировка Python base 36 .

В принципе, в википедии есть такой пример:

def base36encode(number, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
    """Convert positive integer to a base36 string."""
    if not isinstance(number, (int, long)):
        raise TypeError('number must be an integer')

    # Special case for zero
    if number == 0:
        return alphabet[0]

    base36 = ''

    sign = ''
    if number < 0:
        sign = '-'
        number = - number

    while number != 0:
        number, i = divmod(number, len(alphabet))
        base36 = alphabet[i] + base36

    return sign + base36

def base36decode(number):
    return int(number, 36)

print base36encode(1412823931503067241)
print base36decode('AQF8AA0006EH')

Страница Википедии: http://en.wikipedia.org/wiki/Base_36

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...